2017-10-04 3 views
0

(以前の値に基づいてSQLテーブルレコードを選択するだけではありません)の解決策を見つけるのが苦労しています。私はLAG()関数を使って直後のレコードにデータを入れるためのスクリプトを得ることができますが、(CCのような)行に同じ値があると、次の値ではない現在の値と同じです。次のレコードに基づいてレコードを更新する

同じBaseIDを持つ値だけが評価されるようにCASE/WHEN条件を追加できると便利です。どんな助けでも大歓迎です。

は、ここに私の望ましい結果である:

BaseID Value Date  NextValue 
1  AA  2017-10-01 BB 
1  BB  2017-10-02 CC 
1  CC  2017-10-03 DD 
1  CC  2017-10-03 DD 
1  CC  2017-10-03 DD 
1  DD  2017-10-04 NULL 
2  EE  2017-10-01 FF 
2  FF  2017-10-02 GG 
2  GG  2017-10-03 NULL 
+1

"次へ"を定義する必要はありますか?サンプルデータには、注文の定義に使用できるものは何もありません。 –

+0

これについて申し訳ありませんが、日付はソート値 – dbreienrk1

+0

です。ここでは、重複する行があるので、実際に並べ替えることはできません。しかし、DENSE_RANKを使用してこれを行うことができます。私にカップルを与えると、私は例を投稿します –

答えて

0

明確なbaseid、値、日付の組み合わせを取得し、CTEの次の値を取得し、update ITTO使用するleadを使用しています。

with cte as (select t1.baseid,t1.value,t1.nextvalue,t2.nxt_value 
      from tbl t1 
      left join (select t.*,lead(value) over(partition by baseid order by datecol) as nxt_value 
         from (select distinct baseid,datecol,value from tbl) t 
         ) t2 
      on t1.baseid=t2.baseid and t1.datecol=t2.datecol and t1.value=t2.value 
      ) 
update cte set nextvalue=nxt_value 

これは、与えられたベースIDと日付の組み合わせに対して複数の値があることができないことを前提としています。

+0

これは実際には私の解決策よりも少し上手くいくはずですが、ここでの書式設定では解読が難しくなります。 –

0

別のオプションとしてDENSE_RANKを使用した実例です。

declare @Something table 
(
    BaseID int 
    , MyValue char(2) 
    , MyDate date 
    , NextValue char(2) 
) 

insert @Something 
(
    BaseID 
    , MyValue 
    , MyDate 
) VALUES 
(1, 'AA', '2017-10-01') 
, (1, 'BB', '2017-10-02') 
, (1, 'CC', '2017-10-03') 
, (1, 'CC', '2017-10-03') 
, (1, 'CC', '2017-10-03') 
, (1, 'DD', '2017-10-04') 
, (2, 'EE', '2017-10-01') 
, (2, 'FF', '2017-10-02') 
, (2, 'GG', '2017-10-03') 
; 

with SortedResults as 
(
    select * 
     , DENSE_RANK() over(partition by BaseID order by BaseID, MyDate) as MyRank 
    from @Something 
) 

update sr set NextValue = sr2.MyValue 
from SortedResults sr 
join SortedResults sr2 on sr2.MyRank - 1 = sr.MyRank and sr.BaseID = sr2.BaseID 


select * 
from @Something 
+0

これは失敗します。次の値はあなたのCTEで定義されていません。 –

+0

@ AndrewO'Brienは本当に???実際に試しましたか? NextValueはcteで絶対に定義されています。 cteにはselect *があり、テーブルにはNextValueがあります。 –

+0

申し訳ありませんが、私はテーブル変数の次の値に気付かず、それを私のままにしました。 CTEでそれを見ることを期待していた。あなたは正しいです。 –

関連する問題