【发布时间】:2021-09-08 19:15:55
【问题描述】:
在以下查询中:
SELECT
DISTINCT *,
ROW_NUMBER() OVER (PARTITION BY dog_guid ORDER BY created_at ASC) AS test_number,
LAG(created_at) OVER (PARTITION BY dog_guid ORDER BY created_at ASC) AS previous_test_date,
CAST(DATEDIFF(SECOND, LAG(created_at) OVER (PARTITION BY dog_guid ORDER BY created_at ASC), created_at)/(60*60*24) AS FLOAT) AS date_diff_days,
CAST(DATEDIFF(SECOND, LAG(created_at) OVER (PARTITION BY dog_guid ORDER BY created_at ASC), created_at)/(60) AS FLOAT) AS date_diff_mins,
FIRST_VALUE(created_at) OVER (PARTITION BY dog_guid ORDER BY created_at ASC) AS first_test_date,
LAST_VALUE(created_at) OVER (PARTITION BY dog_guid ORDER BY created_at ASC) AS last_test_date
FROM
complete_tests c
WHERE
dog_guid IS NOT NULL
FIRST_VALUE() 函数工作正常,但 LAST_VALUE() 只是给出该列的日期。这是为什么呢?
【问题讨论】:
-
因为您忘记了
LAST_VALUE中的范围。它的工作方式与文档中的完全一致(并且是正确的)。请参阅解释此确切行为的文档中的 example。 -
因为默认范围是
BETWEEN RANGE UNBOUNDED PRECEDING AND CURRENT ROW,它适用于第一个值但不适用于最后一个值。您可以显式覆盖此范围,但更简单的方法是在相同的订单上执行FIRST_VALUE(),但DESC。
标签: sql-server window-functions