0

假设有一个表 dd:

id(整数) 名称(varchar) ts(日期)
1 第一的 2021-03-25
2 第一的 2021-03-30

当我使用以下内容查询此表时:

SELECT *, MAX(ts) OVER (PARTITION BY name ORDER BY ts) max_ts FROM dd;

那么结果是:

id(整数) 名称(varchar) ts(日期) max_ts(日期)
1 第一的 2021-03-25 2021-03-25
2 第一的 2021-03-30 2021-03-30

当我将“DESC”添加到 Order By 子句时:

SELECT *, MAX(ts) OVER (PARTITION BY name ORDER BY ts DESC) max_ts FROM dd;

结果是:

id(整数) 名称(varchar) ts(日期) max_ts(日期)
2 第一的 2021-03-30 2021-03-30
1 第一的 2021-03-25 2021-03-30

这一次的结果是我所期望的。考虑到我按名称对记录进行分区,然后从中获取最大日期,我希望max_ts值在两种情况下都相同(最大值),因为从组中获取最大值时顺序并不重要. 但实际上,在第一种情况下,结果包含不同的max_ts值,而不是最大值。

为什么它会这样工作?为什么排序会影响结果?

4

1 回答 1

1

这个语法:

MAX(ts) OVER (PARTITION BY name ORDER BY ts)

是由 排序的累积最大值ts。窗口框架从 的最小值开始ts。随后的每一行都更大——因为 与ORDER BY是同一列ts。这并不有趣;ts在每一行上是按 排序时的累积最大值ts

另一方面:

MAX(ts) OVER (PARTITION BY name ORDER BY ts DESC)

这是相反顺序的累积最大值。因此,窗口框架中的第一行是最大值ts。所有后续行将是最大值。

不过,这不是表达这一点的最有效方式。我认为这更好地捕捉了你想要的逻辑:

MAX(ts) OVER (PARTITION BY name)
于 2021-03-26T01:12:28.607 回答