SQL查找组中的行,其中列具有null和非null值

时间:2016-03-04 14:03:02

标签: sql sql-server

数据

   row    ID YEAR  PROD STA                    DATE
    01    01 2011 APPLE NEW 2011-11-18 00:00:00.000
    02    01 2011 APPLE NEW 2011-11-18 00:00:00.000
    03    01 2013 APPLE OLD NULL
    04    01 2013 APPLE OLD NULL
    05    02 2013 APPLE OLD 2014-04-08 00:00:00.000
    06    02 2013 APPLE OLD 2014-04-08 00:00:00.000
    07    02 2013 APPLE OLD 2014-11-17 10:50:14.113
    08    02 2013 APPLE OLD 2014-11-17 10:46:04.947
    09    02 2013 MELON OLD 2014-11-17 11:01:19.657
    10    02 2013 MELON OLD 2014-11-17 11:19:35.547
    11    02 2013 MELON OLD NULL
    12    02 2013 MELON OLD 2014-11-21 10:32:36.017
    13    03 2006 APPLE NEW 2007-04-11 00:00:00.000
    14    03 2006 APPLE NEW 2007-04-11 00:00:00.000
    15    04 2004 APPLE OTH 2004-09-27 00:00:00.000
    16    04 2004 APPLE OTH NULL

ROW不是表格中的一列。只是为了显示我想要的记录。

问题

我需要查找由(ID,YEAR,PROD,STA)组成的组至少有一个NULL DATE和一个非NULL DATE的行。

预期结果

从上面的数据集中,这将是第9行到第12行和第15行到第16行

我坐在SSMS前面,不知道怎么做到这一点。考虑group byexists,但实际上不知道。

1 个答案:

答案 0 :(得分:3)

您可以使用COUNT ... OVER

SELECT ID, YEAR, PROD, STA, [DATE]
FROM (
  SELECT ID, YEAR, PROD, STA, [DATE],
         COUNT(IIF([DATE] IS NULL, 1, NULL)) OVER 
              (PARTITION BY ID, YEAR, PROD, STA) AS cnt_nulls,
         COUNT(IIF([DATE] IS NOT NULL, 1, NULL)) OVER
               (PARTITION BY ID, YEAR, PROD, STA) AS cnt_not_nulls
  FROM mytable) AS t
WHERE t.cnt_nulls > 0 AND t.cnt_not_nulls > 0

COUNT的窗口版本在ID, YEAR, PROD, STA数据分区上两次:它为每行返回 当前分区的填充。计数有条件执行:

  • 第一个COUNT计算分区中NULL [Date]值的数量
  • 第二个COUNT计算分区中NOT NULL [Date]个值的数量。

外部查询检查内部查询的两个COUNT函数的计数至少一个的分区。