3

日付別の項目の表があります(各行は新しい日付です)。別の列Dから値を引き出していますが、0を置き換えるために値が必要です。次のロジックが必要です。その日付のD=0の場合、前の日付の列Dの値を使用します。

実際、正直なところ、Dが0の場合は、Dが0ではなかった最新の日付の値を使用しますが、最初の値を使用すると、ほとんどの場合、そこに到達します。

このロジックを構築する方法はありますか?多分CTE?

どうもありがとうございます。

PS私はSSMS2008を使用しています。

編集:私は最初はあまり明確ではありませんでした。変更したい値は日付ではありません。日付に基づいて、Dの値をDからの最新のゼロ以外の値に変更したい。

4

5 に答える 5

4

次のクエリが役立つ場合があります。を使用しOUTER APPLYて結果をフェッチします。スクリーンショット1は、サンプル データとサンプル データに対するクエリ出力を示しています。このクエリはもっと​​うまく書くことができますが、これは私が今思いついたものです。

それが役立つことを願っています。

SELECT      ITM.Id
        ,   COALESCE(DAT.New_D, ITM.D) AS D
        ,   ITM.DateValue
FROM        dbo.Items   ITM
OUTER APPLY (
                SELECT      
                TOP 1       D   AS New_D
                FROM        dbo.Items DAT
                WHERE       DAT.DateValue   < ITM.DateValue
                AND         DAT.D           <> 0
                AND         ITM.D           = 0
                ORDER BY    DAT.DateValue DESC
            ) DAT

スクリーンショット #1:

1

于 2011-06-07T15:07:47.503 に答える
1
UPDATE t
Set value = SELECT value
              FROM table 
             WHERE date = (SELECT MAX(t1.date)
                             FROM table t1
                            WHERE t1.value != 0
                              AND t1.date < t.date)
 FROM table t
WHERE t.value = 0
于 2011-06-07T14:49:54.877 に答える
0

更新スクリプトの一部として、このようなことができます...

SET myTable.D = (
   SELECT TOP 1 myTable2.D 
   FROM myTable2
   WHERE myTable2.myDateField < myTable.myDateField
   AND myTable2.D != 0
   ORDER BY myTable2.myDateField DESC)

これは、選択クエリの目的で値を置き換えるだけでなく、実際にデータを更新することを前提としています。

于 2011-06-07T14:47:10.937 に答える
0
SELECT t.id,
    CASE WHEN t.D = 0 THEN t0.D
         ELSE t.D END
FROM table AS t
LEFT JOIN table AS t0
    ON t0.time = 
    (
        SELECT MAX(time) FROM t0
        WHERE t0.time < t.time
        AND t0.D != 0
    )

または、集計を完全に避けたい場合は、

SELECT t.id,
   CASE WHEN t.D = 0 THEN t0.D
       ELSE t.D END
FROM table AS t
LEFT JOIN table AS t0
    ON t0.time < t.time
LEFT JOIN table AS tx
    ON tx.time > t0.time
WHERE t0.D != 0
    AND tx.D != 0
    AND tx.id IS NULL  -- i.e. there isn't any
于 2011-06-07T15:40:56.640 に答える
0

どうですか:

SELECT
    i.ID,
    i.DateValue,
    D = CASE WHEN I.D <> 0 THEN I.D ELSE X.D END
FROM
    Items I
    OUTER APPLY (
        SELECT TOP 1 S.D 
        FROM Items S 
        WHERE S.DATEVALUE < I.DATEVALUE AND S.D <> 0 
        ORDER BY S.DATEVALUE DESC
    ) X
于 2011-06-07T15:26:35.167 に答える