我需要按“ Ico”列对所有数据进行分组,并从每个组(125、130、140)中仅选择“ ValidTo”列不为NULL的那些数据。
我有一组数据:
Id Ico ValidTo
1 125 NULL
2 125 7.5.2019
3 125 7.5.2019
4 130 20.5.2019
5 130 21.5.2019
6 140 NULL
7 140 NULL
结果将是
Ico ValidTo
130 21.5.2019
结果不必分组,也不必仅显示最大有效日期(但这会很好)
性能不是问题,该查询仅用于测试目的,以测试我的多个LINQ查询是否正确完成了工作。
关于如何实现此目标的任何建议?谢谢。
答案 0 :(得分:1)
只需使用not exists
select * from your_data t1
where not exists (
select 1
from your_data t2
where t1.ico = t2.ico and t2.validto is null
)
此解决方案不对数据进行分组。如果您真的对每个组中的最大组感兴趣,则可以使用row_number()
窗口函数
select *
from (
select *,
row_number() over (partition by t1.ico order by validto desc) rn
from your_data t1
where not exists (
select 1
from your_data t2
where t1.ico = t2.ico and t2.validto is null
)
) t
where t.rn = 1
答案 1 :(得分:1)
一种解决方法是按ico
列进行分组,并检查该组中的行数是否等于非空行的总和。
SELECT ico, MAX(validto)
FROM foo t1
GROUP BY ico
HAVING SUM(CASE WHEN validto IS NULL THEN 0 ELSE 1 END) = COUNT(id)