Presto:是 MAX_BY() 确定性的

Presto: is MAX_BY() deterministic

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

presto documentation 没有提到这个。 This documentation about 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

它 return 编辑了第一行,因此感觉不随意但也不能证明事情。

有人能帮忙吗?

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

使用 window 函数可能更安全,也更高效:

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

对于这种简单的情况,row-limiting 子句实际上就足够了:

select *
from my_table 
order by something desc
limit 1

两个查询都保证 returned 值都属于同一行。

然而,

None 是确定性的,因为同一查询的连续执行可能 return 不同的行。如果你想要一个稳定的结果,那么你需要一个列(或一组列)来唯一标识每一行:在 order by 子句中添加 id 就可以了。

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

如果您希望所有值都一致,则必须使用您提到的技巧,将所有感兴趣的列打包到类型为 ROW:

的单个值中
SELECT max_by((x1, x2, x3), y) r
FROM (...) t(y, x1, x2, x3)