SQL Server 根据NULL和MAX(日期)值选择按日期时间列筛选的分组表(按ID

k0pti3hp  于 2023-02-07  发布在  其他
关注(0)|答案(2)|浏览(111)

假设我有一个表,其中有很多列,但是必须只通过Id和EndDate过滤返回。
| 身份证|结束日期|...|
| - ------|- ------|- ------|
| 1个|零||
| 1个|2022年1月1日15时25分||
| 1个|二○二二年一月一日||
| 第二章|2022年1月15日上午10时||
| 第二章|2022年1月15日上午11时||
| 第二章|2022年1月17日零时||
| 三个|零||
| 三个|2022年10月10日22:12||
| 四个|二○二二年五月十八日十七时十五分||
| 四个|2022年5月18日17时17分||
| 四个|2022年5月19日零时||
生成的表必须如下所示:
| 身份证|结束日期|...|
| - ------|- ------|- ------|
| 1个|零||
| 第二章|2022年1月17日零时||
| 三个|零||
| 四个|2022年5月19日零时||
必须选择具有特定ID的记录,否则该记录的EndDate值为NULL或MAX值。如结果表所示,ID = 1的记录的EndDate为NULL,因此必须选择该记录,ID = 4的记录没有可为NULL的EndDate,因此必须返回具有MAX(EndDate)的值。
我尝试了不同的场景与连接和联合,但它似乎绝望。此外,我考虑了CTE表的东西,但它似乎无关。重点也是得到一个最佳的解决方案,因为结果表被认为是连接到另一个表。如果至少有一个想法,如何得到一个想要的结果,我将不胜感激。

wbgh16ku

wbgh16ku1#

您可以在公用表表达式中使用ROW_NUMBER来定义优先级。只需将NULL替换为遥远的未来日期(如9999-12-31),然后就可以对日期进行排序。

WITH cte
AS
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY ISNULL(EndDate,'99991231') DESC) AS RN
    FROM dbo.myTable
)
SELECT *
FROM cte
WHERE cte.RN = 1;
but5z9lq

but5z9lq2#

使用简单的聚合和CASE表达式(检查每个Id是否有null日期):

SELECT Id,
       CASE WHEN COUNT(*) = COUNT(EndDate) THEN MAX(EndDate) END AS EndDate
FROM tablename
GROUP BY Id;

仅当所有日期不是null时,才满足条件COUNT(*) = COUNT(EndDate)
请参见demo

相关问题