0

次のような単純化されたデータベースがあります。

ID  |  SecondID   |  DateRecorded  |  NumberToCheck  |  NumberToUpdate

NumberToUpdate現在、すべての行の値が 0 です。

NumberToUpdate同じ行の の値で更新したいのですNumberToCheckが、MINUS の値NumberToCheck は最も古いDateRecorded" (Min(DateRecorded)" で、NumberToCheckは 0 より大きく、元の行と同じ ID と secondID を持っています。

これまでのところ、

UPDATE dbo.Table
SET NumberToUpdate =//Update NumberToUpdate
   NumberToCheck - //NumberToCheck from the current row, subtracting...
      (SELECT TOP 1 t2.NumberToCheck FROM Table t2 WHERE ID = t2.ID AND secondID = t2.secondID AND t2.DateRecorded = 
      (SELECT TOP 1 MIN(t3.DateRecorded) FROM Table t3  WHERE t2.ID = t3.ID AND t2.secondID = t3.secondID AND t3.Passes > 0))
      //the NumberToCheck with the earliest date, of the same ID.

ただし、これは正しくなく、意味のない値を返しています (マイナス値があってはならないものも含まれています!)。

ここで私は何を忘れましたか?

どうもありがとう

4

2 に答える 2

1

まず、選択クエリから始めて、必要な値を取得する必要があります。

select t.*
from (select t.*, row_number() over (partition by id order by date) as seqnum
      from table t
      where number_to_check > 0
     ) t
where seqnum = 1

これで、元の更新でこれを使用できます。

with vals as (select t.*
              from (select t.*, row_number() over (partition by id order by date) as seqnum
                    from table t
                    where NumberToCheck > 0
                   ) t
              where seqnum = 1
             )
update table
    set NumberToUpdate = NumberToCheck - vals.NumberToCheck
from vals
where t.id = vals.id
于 2012-06-18T17:31:21.463 に答える
0
UPDATE dbo.Table as t1
INNER JOIN
(
  SELECT MIN(DateRecord) as mindate, ID
  FROM dbo.Table
  GROUP BY ID
) as mindates
ON t1.ID = mindates.ID
INNER JOIN
dbo.Table as substractions
ON mindates.mindate = substraction.DateRecord
AND mindates.ID = substraction.ID
SET t1.numberToUpdate = t1.numberToCheck - substractions.NumberToCheck
WHERE substraction.NumberToCheck > 0
--your questions is ambigious here: did you mean this one should be greater than 0, or should t1.NumberToCheck > 0 ?
AND t1.DateRecord <> mindates.mindate
--Assuming that you don't want to update the record with the lowest date.

注: これは、ID と組み合わせた DateRecord が一意であることを前提としていますが、これは構造によって保証されていません。残念ながら、このテーブル レイアウトでは他に方法がありません。

于 2012-06-18T17:32:40.500 に答える