为什么 min() 的行为与 max() 不同?
Select
max(My_Date) over (order by My_Date) as Max_Datum
, min(My_Date) over (order by My_Date) as Min_Datum
From
(
Select dateadd(m,-1,getdate()) as My_Date
Union all
Select getdate() as My_Date
Union all
Select dateadd(m,1,getdate()) as My_Date
Union all
Select dateadd(m,2,getdate()) as My_Date
) t1
结果:
Max_Datum Min_Datum
2024-08-02 16:20:39.733 2024-08-02 16:20:39.733
2024-09-02 16:20:39.733 2024-08-02 16:20:39.733
2024-10-02 16:20:39.733 2024-08-02 16:20:39.733
2024-11-02 16:20:39.733 2024-08-02 16:20:39.733
问题不在于函数,而在于你的
OVER
子句。你添加了一个OVER
带有子句的子句ORDER BY My_Date
,根据文档,该子句默认为窗口RANGE UNBOUNDED PRECEDING AND CURRENT ROW
。因此,该MAX
值始终是当前行的值,因为这是数据的顺序。以以下简化数据为例:
现在假设您有一个类似的查询:
这将导致以下结果:
实际上,在每一行上你都要问以下问题:
因此,你可以看到,意愿
MAX
有所不同,但意愿MIN
没有变化。您可能想要在这里更改
ORDER
,将窗口指定为整个数据集,或者不指定窗口:最后一种可能在这里最“合理”,因为将
MIN
/的数据MAX
按照您获取MIN
/的值的顺序排列MAX
没有任何作用。如果您按不同的列排序,那就更合理了。db<>小提琴
MIN 函数向后查看(包括当前行和所有前面的行),因此它一直返回它所看到的最早日期。
MAX 函数也会向后查看但会不断更新到它遇到的最新最大值。
MAX():当您向下移动行时,它会查看当前行及其之前的所有行。它始终选择迄今为止看到的最大(最新)日期。
MIN():当您向下移动行时,它还会查看当前行及其之前的所有行。但它始终选择迄今为止看到的最小(最早)日期。
您的数据您有以下日期:
2024-08-02 2024-09-02 2024-10-02 2024-11-02 对于 MAX():
从 2024-08-02 开始。移至 2024-09-02:“哪个更大?2024-09-02 还是 2024-08-02?”它保留 2024-09-02。
接下来是 2024-10-02:“哪个更大?2024-10-02 还是 2024-09-02?” 它保留 2024-10-02。
最后,2024-11-02:“哪个更大?2024-11-02 还是 2024-10-02?”它保留 2024-11-02。对于 MIN():
从 2024-08-02 开始。移至 2024-09-02:“哪个更小?2024-09-02 还是 2024-08-02?”它保留 2024-08-02。
接下来是 2024-10-02:“哪个更小?2024-10-02 还是 2024-08-02?” 它仍然保留 2024-08-02。
最后,2024-11-02:“哪个更小?2024-11-02 还是 2024-08-02?” 它仍然保留 2024-08-02。
总而言之,min() 和 max() 都会查看有序窗口中的所有先前行,但 min() 会保留最早的日期,而 max() 会更新到最新的日期。这就是您看到您所描述的行为的原因。