在非矩形t-sql表中查找值

时间:2014-10-16 22:54:02

标签: sql-server tsql subset

这可能在Python或R中更容易完成,但我在此表上执行SQL Server查询:

ID  2011  2012  2013  2014
1   NULL  NULL  NULL   YES
2    NO    NO    YES  NULL
3   YES    NO    YES  NULL
4   YES    NO   NULL  NULL
5   NULL   NO    YES    NO

我想返回由第1,2和3行组成的结果集,因为它们是最近值为YES的行。

我确信有一种很好的智能方法可以做到这一点,但我在很多CASE语句中陷入困境。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题;这只是一种可能的方法(其优点是可以很容易地推广到同一数据的其他问题)。让T成为我们感兴趣的表格。

WITH OrdinalYesNo AS (
    SELECT ID, [YESNO], ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [Year] DESC) o
    FROM T UNPIVOT ([YESNO] FOR [Year] IN ([2011], [2012], [2013], [2014])) U
)
SELECT ID
FROM OrdinalYesNo
WHERE o = 1 AND [YESNO] = 'YES'

答案 1 :(得分:0)

不使用动态SQL我认为您必须对列值进行硬编码并使用以下内容:

SELECT ID FROM T
WHERE [2014] = 'YES' 
   OR [2013] = 'YES' AND [2014] IS NULL
   OR [2012] = 'YES' AND [2014] IS NULL AND [2013] IS NULL 
   OR [2011] = 'YES' AND [2014] IS NULL AND [2013] IS NULL AND [2012] IS NULL;

-- or this ugly hack if on SQL 2012
SELECT ID FROM T
WHERE RIGHT(CONCAT([2011], [2012], [2013], [2014]),3) = 'YES'

可能有更好的方法可以做到这一点(但我现在半睡半醒,无法想到)。

Sample SQL Fiddle