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 by
和exists
,但实际上不知道。
答案 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
函数的计数至少一个的分区。