2012-10-29 18 views
3

長時間讀者,第一次海報。希望一些SQL大師能夠借給我一些處理能力來優雅地解決SQL問題,而不需要光標。使用tsql創建一個連續的時間線集

我想創建一個時間線類型結果集從一個數據集與金錢和日期,其中他們出現的順序是重要的。請參閱下面的示例數據和期望。

DECLARE @OrderData TABLE(
     ID      INT IDENTITY, 
     ProductId    INT, 
     WarehouseId    INT, 
     Cost MONEY, 
     SaleDate   DATETIME 
) 

INSERT INTO @OrderData 
VALUES 
     (1, 1, 2.71, '2012-02-23 10:01') 
     ,(1, 2, 2.71, '2012-02-23 10:02') 
     ,(1, 1, 2.71, '2012-02-23 10:03') 
     ,(1, 1, 2.71, '2012-02-23 10:04') 
     ,(1, 1, 2.71, '2012-02-23 10:05') 
     ,(1, 1, 2.8, '2012-02-23 10:06') 
     ,(1, 1, 2.9, '2012-02-23 10:07') 
     ,(1, 1, 2.71, '2012-02-23 10:08') 
     ,(1, 1, 2.71, '2012-02-23 10:09') 

我正在尋找的結果是銷售與和日期爲它自己的一套銷售中的產品和倉庫組合的時間線。只要銷售價格在數據集中發生變化,就應該在結果集中產生新的一行。

樣本數據的結果結構。

Product, warehouse, minsale date, Max sale date 
1,1,2.71, 2012-02-23 10.01, 2012-02-23 10.05 
1,1,2.80, 2012-02-23 10.06, 2012-02-23 10.06 
1,1,2.90, 2012-02-23 10.07, 2012-02-23 10.07 
1,1,2.71, 2012-02-23 10.08, 2012-02-23 10.09 
1,2,2.71, 2012-02-23 10.02, 2012-02-23 10.02 

歡呼任何幫助。

+0

你能解釋一下你的樣品結果,請最後一排?爲什麼它沒有被第一行處理? –

+0

@Damien_The_Unbeliever:你的意思是唯一的「倉庫= 2」嗎? –

+0

@AndriyM - 是的,我的眼睛不知何故掩蓋了2. –

回答

4

這是一個「缺口和孤島」問題。

select ProductID, WarehouseId, cost, MIN(saledate), MAX(saledate) from 
(  
    select *, 
     ROW_NUMBER() over (order by saledate)- 
     ROW_NUMBER() over (partition by cost order by saledate) grp 
    from @OrderData 
) v 
group by ProductID, WarehouseId, grp, cost 
order by WarehouseID, MIN(SaleDate) 

如需進一步信息,搜索「差距和島嶼由伊茨克奔淦」

+1

可能你忘了在分區中包含'product'和'warehouse'(在兩個ROW_NUMBER中)。 –

+0

@AndriyM我不確定從樣本數據中是否應該包含它們,所以我將它們排除在清晰的結果集計算方法 – podiluska

+0

其實我認爲我推翻了這個,對不起。不需要額外的分區,因爲'grp'無論如何都不會用於沒有'ProductID'和'WarehouseID'的分組。我想我在那裏或者其他什麼地方有過度矯正。我現在完全沒有問題。 –

相關問題