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)
函数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)