首页 > 解决方案 > 使用先前的非空数据状态

问题描述

我正在尝试在数据不可用的地方继承之前的数据状态。

例如,我有以下数据:

Month   Order   Amount
----------------------
   1    Item1   100
   1    Item2   200
   1    Item3   300
   2    NULL    NULL
   3    Item4   100
   4    NULL    NULL
   5    NULL    NULL
   6    Item1   100

所以在上面的例子中,我想使用第 1 个月的信息来结转第 2 个月。此外,由于第 3 个月的信息可用,因此将其用于第 4 个月和第 5 个月。

因此输出将如下:

Month   Order   Amount
----------------------
   1    Item1   100
   1    Item2   200
   1    Item3   300
   2    Item1   100
   2    Item2   200
   2    Item3   300
   3    Item4   100
   4    Item4   100
   5    Item4   100
   6    Item1   100

标签: sqlsql-server

解决方案


您可以使用LEFT JOIN. 如果您在“月份”加入,您可以确保加入的“月份”具有最大值(到目前为止)并且还有一个非空的“订单”。

SELECT *
  FROM      myTable t1
  LEFT JOIN myTable t2 ON t2.Month = (SELECT MAX(Month)
                                        FROM myTable
                                       WHERE Month <= t1.Month
                                         AND [Order] IS NOT NULL)

一开始你会得到太多行,因为 "Month" 1 会给出 9 行。您还可以通过确保加入的“月份”严格降低来删除它们:

SELECT *
  FROM      myTable t1
  LEFT JOIN myTable t2 ON t2.Month = (SELECT MAX(Month)
                                        FROM myTable
                                       WHERE Month <= t1.Month
                                         AND [Order] IS NOT NULL)
                      AND t1.Month > t2.Month

然后你只需要SELECT正确的列:

SELECT t1.Month,
       COALESCE(t1.[Order],t2.[Order]) as [Order],
       COALESCE(t1.Amount,t2.Amount) as Amount
  FROM      myTable t1
  LEFT JOIN myTable t2 ON t2.Month = (SELECT MAX(Month)
                                        FROM myTable
                                       WHERE Month <= t1.Month
                                         AND [Order] IS NOT NULL)
                      AND t1.Month > t2.Month

小提琴手


推荐阅读