按每周一分组数据未按预期工作
Posted
技术标签:
【中文标题】按每周一分组数据未按预期工作【英文标题】:Grouping data by Each Monday not working as intended 【发布时间】:2020-07-17 16:23:11 【问题描述】:目标:
我正在尝试按周聚合数据,其中开始日期为星期一,结束日期为星期日。
预期结果:
+----------+-----------+----------+
| Date | Name | WeekDate |
+----------+-----------+----------+
| 1/1/2018 | Monday | 1/1/2018 |
| 1/2/2018 | Tuesday | 1/1/2018 |
| 1/3/2018 | Wednesday | 1/1/2018 |
| 1/4/2018 | Thursday | 1/1/2018 |
| 1/5/2018 | Friday | 1/1/2018 |
| 1/6/2018 | Saturday | 1/1/2018 |
| 1/7/2018 | Sunday | 1/1/2018 |
| 1/8/2018 | Monday | 1/8/2018 |
+----------+-----------+----------+
实际发生的情况:
+------------+------------+
| date | WeekDate |
+------------+------------+
| 2018-01-01 | 2018-01-01 |
| 2018-01-02 | 2018-01-01 |
| 2018-01-03 | 2018-01-01 |
| 2018-01-04 | 2018-01-01 |
| 2018-01-05 | 2018-01-01 |
| 2018-01-06 | 2018-01-01 |
| 2018-01-07 | 2018-01-08 |
| 2018-01-08 | 2018-01-08 |
+------------+------------+
代码:
select
cast(dateadd(week,DATEDIFF(week,0, [date]),0) as date) AS Date
,count(user_id) AS count
from ##data
为什么应该在 2018-01-01 的时候将 1 月 7 日放到 2018-01-08 组中。
【问题讨论】:
减去一天然后加回来会起作用:dateadd(day, 1, cast(dateadd(week,DATEDIFF(week,0, dateadd(day, -1,[date])),0) as date))
你的不起作用的原因是,虽然它折叠成几周,但它仍然依赖于一周是周日到周六的定义。当您覆盖您想要的任何一周时,您会看到它跨越两个不同的“datediff”周。
@shawnt00 谢谢!但后来我尝试将 DATEFIRST 更改为 1 但它没有做任何事情......
对。但是你们查看datediff
上的文档,它说datefirst
不会改变其行为以使其保持确定性功能。
【参考方案1】:
我会推荐以下日期算法:
set datefirst 1;
select
d.*,
dateadd(day, 1 - datepart(weekday, [date]), [date]) AS first_day_of_week, from ##data d;
第一条指令将星期一定义为一周的第一天。然后,date_part()
会为您提供一个代表星期几的数字,您可以使用该数字将日期偏移到前一个星期一。
【讨论】:
完美,但出于好奇,您对我的代码为什么没有按预期工作有任何解释吗?【参考方案2】:您可以使用 ISO_WEEK 每周对数据进行分组,如下所示。 您可以查看 ISO_WEEK 如何解释您的数据Here
select *, datepart(ISO_WEEK,Date) WeekNumber
from your_table
对于您所需的确切输出,您可以尝试以下逻辑-
Demo Here
select *,
DATEADD(
DD,
-
CASE
WHEN datepart(weekday,date) = 1 THEN 7
ELSE datepart(weekday,date) - 1
END + 1,
DATE
)
from your_table
【讨论】:
以上是关于按每周一分组数据未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章