2012-12-04 4 views
1

이전에 답변을 받았지만 찾을 수 없었을 것입니다.주어진 날짜의 상태를 가져 오기위한 SQL 쿼리

몇 주마다 상태가 변경되는 항목 테이블이 있습니다. 나는 임의의 날을보고 각 지위에 얼마나 많은 물건이 있었는지 알아 내고 싶다. 예를 들어

:

tbl_ItemHistory

ItemID 
StatusChangeDate 
StatusID 

샘플 데이터 :

1001, 1/1/2010, 1 
1001, 4/5/2010, 2 
1001, 6/15/2010, 4 
1002, 4/1/2010, 1 
1002, 6/1/2010, 3 
... 

그래서 나는 많은 항목이 주어진 일에 대한 각 상태에 있었던 방법을 알아낼 필요가있다. 그래서 2010 년 5 월 1 일에 상태 2에는 항목 1 개 (1001)가 있고 상태 1 (1002)에는 항목 1 개가있었습니다.

이 항목은 상태가 자주 변경되지 않으므로 매일 밤마다 모든 항목과 행을 포함하는 캐시 된 테이블을 만들 수 있습니다.

select ih.* 
from (select ih.*, 
      row_number() over (partition by itemId order by StatusChangeDate desc) as seqnum 
     from tbl_ItemHistory ih 
     where StatusChangeDate <= @YOURDATEGOESHERE 
    ) ih 
where seqnum = 1 

아이디어 : 그 또는

하지만 내가 임의의 일을 위해 SQL 서버 2008R2

+0

[무엇을 시도 했습니까?] (http://whathaveyoutried.com)? 어떤 쿼리가 작동하지 않았습니까? 정확히 이것에 대해서 당신은 붙어 있습니까? – Oded

+0

첫 번째 질문은 접근 방식입니다. 결과를 다른 테이블에 캐시해야합니까? 그렇다면 어떻게해야합니까? 나는 SQL의 초보자입니다 – user46372

답변

3

를 사용하고 있음을 수행하는 방법, 당신이 뭔가를 할 수있는 최선의 방법 있는지 확실하지 않습니다 row_nubmer을 사용하여 각 날짜 이전의 모든 기록 레코드를 열거하는 것입니다. 순서는 역순, 그래서 가장 최근의 기록 - 또는 날짜 이전에이 - 쿼리가 다음 단지 값이 1

집계 레코드를 선택 1.

의 값이 날짜에 대한 각 상태를 얻으려는 결과는 다음과 같습니다.

select statusId, count(*) 
from (select ih.*, 
      row_number() over (partition by itemId order by StatusChangeDate desc) as seqnum 
     from tbl_ItemHistory ih 
     where StatusChangeDate <= @YOURDATEGOESHERE 
    ) ih 
where seqnum = 1 
group by StatusId 
+0

당신은 바로 Gordon입니다, 나는 그 질문의 일부를 놓쳤습니다. 혼란을 피하기 위해 내 대답을 철회 할 것입니다 ... – squawknull

+0

대단하군요. 나는 파티션 기능을 연구해야 할 것이다. 모든 항목과 일년 중 매일 행이있는 테이블을 만들고 싶다고 가정 해 봅시다. 그렇게하면 좀 더 쉽게보고 할 수 있습니다. 내가 어떻게 그럴 수 있니? – user46372

+0

@ user46372 . . 다른 질문을 할 기회가 있습니다. –

관련 문제