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:添加缺失的日期和值的主要内容,如果未能解决你的问题,请参考以下文章