有一个任务是从表(MSSQL)中选择记录并按ID和DT对它们进行分组,并且如果具有相同id和DT的记录之一的字段date_end为空,则选择该记录,如果有没有该字段,则选择最大日期(需要输出end_date字段)
表结构
| ID | D.T. | 日期结束 |
|---|---|---|
| 12345 | Q2 | 无效的 |
| 12345 | Q2 | 01/01/2023 |
我尝试了这个查询,但两条记录都返回了
select ID,DT,case when date_end is NULL then null else MAX(date_end) end date_end from test
GROUP BY ID,DT,date_end
窗口函数 FIRST_VALUE 有帮助,但速度非常慢
select ID,DT,date_end from(
select ID,DT,FIRST_VALUE(date_end) OVER(ORDER BY date_end asc)date_end from test
)g
GROUP BY ID,DT,date_end
还有哪些其他选择?
ps 感谢@Akina 的回答,最终的请求结果是这样的:
select ID, DT, date_end from (
SELECT ID, DT, date_end,
ROW_NUMBER() OVER (PARTITION BY ID, DT ORDER BY date_end asc) rn
FROM test
)cte
WHERE rn = 1;
此设计的运行速度比 FIRST_VALUE 快得多
最有可能的是,我们正在谈论琐碎的事情
小提琴
另一种没有 CTE 的选择。我们将 NULL 替换为最大可能的日期,取最大值,如果结果是最大日期,则将其替换回 NULL。