3

我有一个按日期排列的项目表(每一行都是一个新日期)。我正在从另一列 D 中提取一个值。不过,我需要它来替换 0。我需要以下逻辑:当该日期的 D=0 时,使用前一天 D 列中的值。

实际上,说实话,我需要说的是,当 D 为 0 时,使用 D 不是 0 的最近日期的值,但第一个将使我大部分时间到达那里。

有没有办法建立这个逻辑?也许是CTE?

非常感谢你。

PS我正在使用SSMS 2008。

编辑:起初我不是很清楚。我要更改的值不是日期。我想根据日期用 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
    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 回答
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 回答