SQL:添加缺失的日期和值

Posted

技术标签:

【中文标题】SQL:添加缺失的日期和值【英文标题】:SQL: Add missing dates and values 【发布时间】:2020-11-05 17:24:22 【问题描述】:

你好,第一次海报! :)

我有一个输出这个示例数据的表格,但是对于许多用户和不同的日期范围:-

Users..........Date..............Hours
John Smith.....Thu 02-JAN-2020...8 
John Smith.....Fri 03-JAN-2020...8 
John Smith.....Mon 06-JAN-2020...8 
John Smith.....Tue 07-JAN-2020...8 
John Doe.......Fri 03-JAN-2020...8
John Doe.......Mon 06-JAN-2020...8 
John Doe.......Tue 07-JAN-2020...8 
John Doe.......Wed 08-JAN-2020...8

结果应为:- 用户......日期............小时 约翰·史密斯.....星期四 02-JAN-2020...8 约翰·史密斯.....2020 年 1 月 3 日星期五...8 约翰·史密斯.....2020 年 1 月 4 日星期六...0 缺少周末 约翰·史密斯.....2020 年 1 月 5 日星期日...0 缺少周末 约翰·史密斯.....星期一 06-JAN-2020...8 约翰·史密斯.....2020 年 1 月 7 日星期二...8 John Doe.......星期五 03-JAN-2020...8 John Doe.......2020 年 1 月 4 日星期六...0 周末缺席 John Doe.......Sun 05-JAN-2020...0 缺少周末 John Doe.......星期一 06-JAN-2020...8 John Doe.......周二 07-JAN-2020...8 John Doe.......2020 年 1 月 8 日星期三...8

我需要一个查询来包含缺失的周末、名称和小时数为零(因为 DBA 不会更改表的结构并添加周末)。

查看了 CTE(递归)、CROSS JOINS、链接日历表,但无法使其正常工作。

收到的任何建议或指示。

非常感谢。

附:还是习惯了格式,抱歉。

【问题讨论】:

编辑您的问题并显示您想要的结果。 “错过的周末”是什么意思?并标记您正在使用的数据库。 请用您正在运行的数据库标记您的问题:mysql、oracle、postgresql...? 我已将 sql 标记到帖子末尾 @SqlRookie 。 . . SQL 是一种语言,而不是数据库。每个数据库都有自己的方言,这对于回答您的问题很重要,因此对您最有用。 您在尝试日历表时是否使用了左外连接?我无法想象这怎么会让你失望。 【参考方案1】:

如果我理解正确,您可以使用union all 查找用户有另一个日期的星期五。然后再添加两行。

我将假设date 列实际上具有date 数据类型。

这是一个想法:

select user, date, hours
from t
union all
select user, dateadd(day, v.n, date), 0
from (select t.*,
             lead(date) over (partition by user order by date) as next_date
      from t
     ) t cross join
     (values (1), (2)) v(n)
where datepart(weekday, t.date) = 'Friday' and
      next_date is not null;

众所周知,日期/时间函数依赖于数据库。这使用 SQL Server 语法。

【讨论】:

以上是关于SQL:添加缺失的日期和值的主要内容,如果未能解决你的问题,请参考以下文章

添加缺失的报告日期,不包括具有指定值的周末

在 NSArray 中添加缺失的日期

在 MongoDB 聚合中添加缺失的日期

将缺失的日期添加到 pandas 数据框

将缺失的日期添加到时间序列数据框

如何将缺失的日期添加到不带NA的列中?