1

函数是MAX_BY()确定性的。如果我使用MAX_()两个不同的列都取决于第三个,我会得到相同的行结果吗?

presto 文档没有提到这一点 。这个关于 mysql 的文档提到它不是,所以我不确定在哪里可以找到这个信息。

我用以下方法快速测试:

WITH my_table(id, arr, something) AS (
    VALUES
        (1, ARRAY['one'], 0.0),
        (2, ARRAY['two'], 0.0),
        (3, ARRAY['three'], 0.0),
        (4, ARRAY['four'], 0.0),
        (5, ARRAY['five'], 0.0),
        (6, ARRAY[''], 0.0)
)
SELECT
    MAX_BY(id,something),
    MAX_BY(arr,something)
FROM my_table

它返回了第一行,所以它不会让人觉得随意,但也不能证明事情。

有谁可以帮忙吗?

有一个相关的问题是从单个返回多个列,MAX_BY()所以我认为我需要使用该解决方案来保证选择同一行的属性: max_by with multiple return columns

4

2 回答 2

3

不,在平局的情况下,max_byand的结果min_by是任意的。它可能看起来是确定性的,但这不是定义的行为,并且可能会在某些时候发生变化。

如果您希望所有值保持一致,则必须使用您提到的技巧,将所有感兴趣的列打包在一个 type 值中ROW

SELECT max_by((x1, x2, x3), y) r
FROM (...) t(y, x1, x2, x3)
于 2020-11-06T19:23:43.363 回答
1

使用窗口函数可能更安全,也更有效:

select *
from (
    select t.*, row_number() over(order by something desc) rn
    from my_table t
) t
where rn = 1

对于这种简单的情况,行限制子句实际上就足够了:

select *
from my_table 
order by something desc
limit 1

两个查询都保证返回的值都属于同一行。

然而,没有一个是确定性的,因为同一查询的连续执行可能会返回不同的行。如果您想要一个稳定的结果,那么您需要一列(或一组列)可用于唯一标识每一行:在这里添加idorder by子句就可以了。

于 2020-11-06T18:46:37.443 回答