sql - 获取缺失日期的缺失记录并使用之前的非 Null 值更新值
问题描述
我有下表,其中教师每天更新数据,但有些教师不会每天更新记录。我需要找到丢失的日期并在 Val 和 TotalValue 字段中添加以前的 NOT NULL 值。我有日期表,我确实离开了日期表,但无法更新非空记录。1 月 2 日和 1 月 3 日缺少行,我需要在结果中添加行
DECLARE @Table TABLE(
ID INT,
ClassID VARCHAR(10),
Val INT,
TotalValue INT,
UpdatedDateTime DATETIME2
)
INSERT INTO @Table (ID, ClassID, Val,TotalValue, UpdatedDateTime) SELECT 1, 'AB475', 20, 100, '2020/1/1 14:00:20'
INSERT INTO @Table (ID, ClassID, Val,TotalValue, UpdatedDateTime) SELECT 1, 'ZXCV5', 50, 70, '2020/1/1 14:00:20'
INSERT INTO @Table (ID, ClassID, Val,TotalValue, UpdatedDateTime) SELECT 1, 'GHT09', 40, 40, '2020/1/1 14:00:20'
INSERT INTO @Table (ID, ClassID, Val,TotalValue, UpdatedDateTime) SELECT 1, 'AB475', 70, 100, '2020/1/2 14:00:20'
INSERT INTO @Table (ID, ClassID, Val,TotalValue, UpdatedDateTime) SELECT 1, 'GHT09', 38, 40, '2020/1/2 14:00:20'
INSERT INTO @Table (ID, ClassID, Val,TotalValue, UpdatedDateTime) SELECT 1, 'AB475', 20, 100, '2020/1/3 14:00:20'
INSERT INTO @Table (ID, ClassID, Val,TotalValue, UpdatedDateTime) SELECT 1, 'ZXCV5', 20, 70, '2020/1/3 14:00:20'
SELECT * FROM @Table
ID ClassID Val TotalValue UpdatedDateTime
1 AB475 20 100 2020-01-01 14:00:20.0000000
1 ZXCV5 50 70 2020-01-01 14:00:20.0000000
1 GHT09 40 40 2020-01-01 14:00:20.0000000
1 AB475 70 100 2020-01-02 14:00:20.0000000
1 GHT09 38 40 2020-01-02 14:00:20.0000000
1 AB475 20 100 2020-01-03 14:00:20.0000000
1 ZXCV5 20 70 2020-01-03 14:00:20.0000000
SELECT *
FROM [DATE]
LEFT JOIN @Table
ON [DATE].[DATE] = CAST([@Table].UpdatedDateTime AS DATE)
最终结果应该是
ID ClassID Val TotalValue UpdatedDateTime
1 AB475 20 100 2020-01-01 14:00:20.0000000
1 ZXCV5 50 70 2020-01-01 14:00:20.0000000
1 GHT09 40 40 2020-01-01 14:00:20.0000000
1 AB475 70 100 2020-01-02 14:00:20.0000000
1 GHT09 38 40 2020-01-02 14:00:20.0000000
1 AB475 20 100 2020-01-03 14:00:20.0000000
1 ZXCV5 20 70 2020-01-03 14:00:20.0000000
1 ZXCV5 50 70 2020-01-02 14:00:20.0000000
1 GHT09 38 40 2020-01-03 14:00:20.0000000
解决方案
我将使用cross join
两个select distinct
查询来生成教师和日期的所有可能组合,然后用于cross apply
获取缺失的信息:
select c.ID, c.ClassID, t.Val, t.TotalValue, d.UpdatedDateTime
from (select distinct ID, ClassID from @table) c
cross join (select distinct UpdatedDateTime from @table) d
cross apply (
select top 1 *
from @table t
where t.ClassID = c.ClassID and t.UpdatedDateTime <= d.UpdatedDateTime
order by t.UpdatedDateTime desc
) t
order by c.ID, c.classId, d.UpdatedDateTime
身份证 | 类ID | 瓦尔 | 总价值 | 更新日期时间 -: | :-------- | --: | ---------: | :---------------------------- 1 | AB475 | 20 | 100 | 2020-01-01 14:00:20.0000000 1 | AB475 | 70 | 100 | 2020-01-02 14:00:20.0000000 1 | AB475 | 20 | 100 | 2020-01-03 14:00:20.0000000 1 | GHT09 | 40 | 40 | 2020-01-01 14:00:20.0000000 1 | GHT09 | 38 | 40 | 2020-01-02 14:00:20.0000000 1 | GHT09 | 38 | 40 | 2020-01-03 14:00:20.0000000 1 | ZXCV5 | 50 | 70 | 2020-01-01 14:00:20.0000000 1 | ZXCV5 | 50 | 70 | 2020-01-02 14:00:20.0000000 1 | ZXCV5 | 20 | 70 | 2020-01-03 14:00:20.0000000
推荐阅读
- javascript - jws API 的异步版本有什么好处?
- mysql - Mysql Group By不求和值
- android - Android 旋转文本:我使用 dynamiclayout.draw(canvas) 但它不会沿路径设置动画,并且不能使用 canvas.drawTextOnPath(dynamiclayout)
- list - 将列表的第一项添加到其他列表 Python 的前面
- mongodb - mongodb 从属“身份验证失败”
- android - 从片段后台堆栈中的特定位置删除和导航片段
- android - Unity 2019.3 作业失败并出现异常:GooglePlayServices.JavaUtilities+ToolNotFoundException:找不到 jar
- python - groupby 后聚合列的组合
- debugging - Toad 调试器不进入程序
- python - 如何使用 subprocess 和 os 模块在终端(mac os)中运行命令?