2012-12-04 25 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有一個項目(1001),狀態1有一個項目(1002)。

由於這些項目不會經常更改狀態,也許我可以創建一個緩存的表格,每天晚上對於每個項目和每年的每一天都有一行?我不知道這是最好的或者怎麼做,雖然

我使用SQL Server 2008R2

+0

[你有什麼試過](http://whathaveyoutried.com)?你試過什麼樣的查詢不起作用?你堅持什麼呢? – Oded

+0

我的第一個問題是方法:我需要將結果緩存到另一個表嗎?如果是這樣,我該怎麼做?我是SQL的新手 – user46372

回答

3

,針對任意一天,你可以做這樣的事情:

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 

的想法是使用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

你是對的戈登,我錯過了這部分的問題。我會撤回我的答案,以避免混淆... – squawknull

+0

太棒了。我將不得不去研究分區功能。比方說,我確實想創建一個表,每個項目和每年的每一天都有一排。這將使我可以更輕鬆地進行報告。我會怎麼做? – user46372

+0

@ user46372。 。 。你有機會問另一個問題。 –