4

みんな...現在私は以下のようなテーブルを持っています..

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

つまり、2009年12月31日23.53は製品2003Pの開始時刻であり、2012年1月1日00.13は製品2003Pの停止時刻です。2010年1月1日00.30は前に1つの製品しか生産しないため、製品1259は特別です。他の製品に移動します。基本的に、同じコードであるすべての製品でグループ化されるため、group byを使用できません。問題は、特定の製品コードの開始時刻と停止時刻を検出することです。。これはどのように達成できますか?これはSQLSERVER2005用です...

みんな、ありがとう ..

4

2 に答える 2

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-データ

于 2012-05-21T05:32:55.510 に答える
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=prodcode最後に、との最後のクエリでテーブルの日付を結合しますnext=prodcode

幸運を :)

于 2012-05-21T03:06:19.613 に答える