2017-02-21 1 views
0

내에서 날짜 일치를 찾아 우리가 사용자의 속성 변경 기록이 테이블 : 내가하고 싶은 무엇SQL : 외부 또는 Microsoft SQL Server의 범위

ID | userID | prop | changeDate 
------------------------------- 
4 23  B  2017-02-18 
1 14  D  2013-05-19 
2 15  C  2014-04-10 
3 23  A  2016-01-11 

이 테이블을 조회하고 발견하는 것입니다 일정 범위의 액티브 프로퍼티. 이 2017-02-18

에 변경되었습니다 때까지 해당 사용자의 활성 특성 때문에

예를 들어 2017-01-01-2016-08-01의 기간은 본인은 changeDate BETWEEN '2016-08-01' and '2017-01-01'로 시작하지만 덮 소품 AuserID 23을 좀하고 싶습니다 정확한 시작 날짜가있는 경우.

나는 약간 미쳤어. 이 데이터로이 퀘스트도 가능합니까? 아니면 잘못된 질문을하고 있을까요?

+2

찾고있는 당신을 제공합니다. 해당 기간 동안 사용자가 여러 속성을 갖는 경우 반환 할 내용은 무엇입니까? –

+0

좋은 지적입니다, 고든. 나는 그 부분을 단순화했다. – teni

답변

1

자체는 여기에 도움이 될 수 있습니다 가입 :

은 그 질문에 대답을 제공합니다.

CREATE TABLE x (ID INT, userID INT, prop CHAR(1), changeDate DATETIME) 

INSERT INTO x 
    VALUES (4, 23, 'B', '20170218'), 
     (1, 14, 'D', '20130519'), 
     (2, 15, 'C', '20140410'), 
     (3, 23, 'A', '20160111') 

; WITH cte AS (
    SELECT x1.userID, x1.prop, x1.changeDate AS StartDate, MIN(x2.changeDate) AS ExitDate 
    FROM x x1 
      LEFT OUTER JOIN x x2 
        ON x1.changeDate < x2.changeDate 
    GROUP BY x1.userID, x1.prop, x1.changeDate 
) 

SELECT * 
FROM cte 
WHERE Startdate > = '20160801' 
    AND (ExitDate IS NULL OR ExitDate < '20170101') 

이것은 당신이 당신이 틀린 질문을 생각

userID | prop | StartDate    | ExitDate 
-------------------------------------------------- 
23  B  2017-02-18 00:00:00.000 NULL  
+0

우수. 이것은 완벽 해! 정말 고맙습니다! changeDate, userID, prop로 그룹화합니다. 그러나 이것 이외에 이것은 나의 저녁을 정말로 만들었다 :) – teni

2

이 유형의 표에 대한 일반적인 질문은 "특정 날짜의 특정 사용자 속성은 무엇 이었습니까?"입니다.

select pc.* 
from (select pc.*, 
      row_number() over (partition by userId order by changeDate desc) as seqnum 
     from propertychanges pc 
     where changeDate <= @AsOfDate 
    ) pc 
where seqnum = 1; 
+0

질문과 답변을 제안 해 주셔서 감사합니다.) 잠시 동안 그곳에서 꽤 길을 잃었습니다. 그러나이 경우 날짜 범위가 중요합니다. 따라서 일반적인 질문은 적합하지 않습니다. – teni