2012-05-21 65 views
4

大家...目前我有一個表,如下..SQL Server 2005組由相同列但日期和時間不同?

DATE    BATCHNO  PRODCODE 
---------------------------------------------- 
31/12/2009 23.53 10859  2003P 
01/01/2010 00.04 10860  2003P 
01/01/2010 00.06 10861  2003P 
01/01/2010 00.13 10862  2003P 
01/01/2010 00.30 10863  1259 
01/01/2010 03.02 10864  639B 
01/01/2010 03.13 10865  639B 
01/01/2010 03.20 10866  639B 
01/01/2010 04.13 10867  2003P 
01/01/2010 04.20 10868  2003P 
01/01/2010 04.30 10863  2003P 

以上是我現在已經被..每當有新BATCHNO和BATCHNO是由1增加產生的DATE的表的例子.. PRODCODE是產品的機器製造產品的代碼,並說產品2003P完成製造,它會自動去其他產品,如1259 ...

我想計算這些數據到下面預期結果:

DATE    PRODCODE 
---------------------------------------------- 
31/12/2009 23.53  2003P 
01/01/2010 00.13  2003P 
01/01/2010 00.30  1259 
01/01/2010 00.30  1259 
01/01/2010 03.02  639B 
01/01/2010 03.20  639B 
01/01/2010 04.13  2003P 
01/01/2010 04.30  2003P 

意思是31/12/2009 23.53是產品2003P和01/01/2012的開始時間00.13是產品2003P的停止時間,而產品1259是特殊的,因爲01/01/2010 00.30只產生1產品移動到其他產品之前..基本上我不能使用組,因爲它會由所有產品是相同的代碼組..所以問題是檢測特定產品代碼的開始時間和停止時間。 。這怎麼能完成?這是SQL Server 2005 ...

謝謝大家..

回答

3
select U.[DATE], U.PRODCODE 
from 
    (
    select min(T.[DATE]) as StartDate, 
      max(T.[DATE]) as EndDate, 
      T.PRODCODE 
    from 
     (
     select [DATE], 
       PRODCODE, 
       row_number() over(order by [DATE]) as rn1, 
       row_number() over(order by PRODCODE, [DATE]) as rn2 
     from YourTable 
    ) T 
    group by T.PRODCODE, T.rn2-T.rn1 
) T 
unpivot 
    (
    [DATE] for D in (StartDate, EndDate) 
) U 
order by U.[DATE] 

SE-Data

+2

我認爲你不能保證通過'PRODCODE'排序的行會自動'[日期]排序'其中'PRODCODE'是一樣的。您需要明確添加'[DATE]'作爲排序標準:'row_number()over(按PRODCODE,[DATE]排序)爲rn2'。 –

+0

@AndriyM - 好點。謝謝。 –

+0

感謝你們兩位。意味着上述查詢是正確的? – newbieHQ

2

理念:添加列以獲取下一塊不同的ID開始時間和刪除和查詢來填補它。然後創建另一列,但這次保存以前的不同片段結束時間。這樣的任務的代碼將是子查詢

update table set 
    prev=(select top 1 batchno from table x where x.prodcode!=table.prodcode and x.date<table.date order by x.date DESC)+1, 
    next=(select top 1 batchno from table x where x.prodcode!=table.prodcode and x.date>table.date order by x.date ASC)-1 

這樣你就會有每個產品的邊界。從現在開始,你只

select prodcode, prev, next from table group by prodcode, prev, next 

終於從表連接起來日期上prev=prodcodenext=prodcode最後查詢。

祝你好運:)

相關問題