这可能在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
语句中陷入困境。
非常感谢任何建议。
答案 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'
可能有更好的方法可以做到这一点(但我现在半睡半醒,无法想到)。