sql - 使用先前的非空数据状态
问题描述
我正在尝试在数据不可用的地方继承之前的数据状态。
例如,我有以下数据:
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
解决方案
您可以使用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
推荐阅读
- javascript - 在对象原型中使用 arguments.length
- android - “重命名目录失败”是我尝试在 Android SDK 管理器上安装 Android SDK 工具时不断弹出的错误
- angular - 变化检测不适用于角度输入去抖动
- javascript - 删除 AJAX 加载的变量
- javascript - 如何根据数据流触发 JS 中的视图(部分)变化?
- java - 为什么不使用枚举?
- regex - 字符串中 N 个空格的正则表达式
- python - 根据条件用其他值替换特定轴
- java - 在一个问题连续正确回答 3 次后,我将如何将我的程序循环回到开头/并添加方差
- docker - 如何将 docker-compose 架构和单个项目分成不同的项目?