如何为group by中的每个组指定Where子句

时间:2019-05-07 07:57:25

标签: sql sql-server

我需要按“ 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查询是否正确完成了工作。

关于如何实现此目标的任何建议?谢谢。

2 个答案:

答案 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)