2014-10-16 2 views
0

이것은 아마도 파이썬 또는 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 

내가하고 싶습니다 가장 최근 값이 YES 인 행이기 때문에 행 1, 2 및 3으로 구성된 결과 세트를 리턴하십시오.

나는 이것을 할 좋은 지능적인 방법이있을 것이라고 확신하지만, 너무 많은 CASE 진술에 매질하고있다.

모든 조언을 크게 듣습니다.

답변

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

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'