2

奇妙な更新クエリを書く必要があります。

これがテーブルです

PK-ID (int) --- FK-ID (int) --- Value (int)

私のデータ セットで、FK-ID でグループ化し、PK-ID で並べ替える場合、これが 1 つのグループの例であるとします。

5 --- 10 --- 23
7 --- 10 --- 49
8 --- 10 --- 81

一部の古いソフトウェアのバグにより、レコード 7 と 8 の値が正しくありません。7 の正しい値は (49-23) = 26 で、8 の正しい値は (81-4​​9) = 32 です。レコード 5 は正しいです。

FK-ID でグループ化され、PK-ID で並べ替えられている場合、各レコードを更新して、直前のレコードの値を減算する必要があります。前のレコードがない場合、値を変更する必要はありません。

これを達成するために一般的な SQL 更新クエリを作成する方法はありますか? グループ内の前のレコードの値を (条件付きで) どのように取得しますか? SQL サーバー 2008 を使用しています。

ありがとう!

4

4 に答える 4

2
with ordered as (
    select *, rn = row_number() over (partition by fk_id order by pk_id)
      from tbl
    )
update cur
   set value = cur.value - prior.value
  from ordered cur
  join ordered prior on prior.fk_id = cur.fk_id
                and prior.rn = cur.rn-1;
于 2012-12-12T19:01:16.140 に答える
2

前回と同様の考え方で、これが正解だと思います。toupdate サブクエリは、質問のルールに基づいて値を計算します (同じ外部キーと連続した主キーでレコードを更新します)。IDは何らかの数値であると想定しています。

with toupdate as (
    select t.pkid, t.value - tprev.value as newval
    from t join
         t tprev
         on t.pkid = tprev.pkid+1 and t.fkid = tprev.fkid
   )
update t
    set value = newvalue
    from toupdate
    where t.pkid = toupdate.pkid
于 2012-12-12T19:38:22.683 に答える
1

私はそれがあなたが望むものを返すことを願っています(申し訳ありませんが、私は今それを試すことができません); あなたはそれを組み込む必要がありますUPDATE

 WITH cte1 AS 
 (SELECT pk_id, fk_id, value, ROW_NUMBER() OVER (PARTITION BY fk_id ORDER BY pk_id DESC)
 as num 
 FROM your_table 
 )

 SELECT a.*, 
 --CASE 
 --  WHEN b.pk_id IS NOT NULL THEN a.value-b.value 
 --  ELSE 0 END 
 a.value-b.value as valid_number
 FROM cte1 a
 --LEFT JOIN cte1 b ON (b.fk_id = a.fk_id AND b.num = a.num-1)
 INNER JOIN cte1 b ON (b.fk_id = a.fk_id AND b.num = a.num-1)  
于 2012-12-12T19:00:37.493 に答える
1
update t set value = value -
              isnull((select top 1 value 
                                 from t t2 
                                     where t2.FKID=t.FKID 
                                       and t2.PKID<t.PKID 
                        order by PKID desc),0);

これがSQLFiddleのデモです

于 2012-12-12T19:07:31.480 に答える