sql—按每个星期一对数据进行分组未按预期工作

w46czmvw  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(363)

目标:
我正在尝试按周聚合数据,其中开始日期是星期一,结束日期是星期天。
预期结果:

+----------+-----------+----------+
|   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年1月7日应该在2018年1月1日,却被列入2018年1月8日的小组。

mqxuamgl

mqxuamgl1#

我推荐以下日期算法:

set datefirst 1;
select 
     d.*,
     dateadd(day, 1 - datepart(weekday, [date]), [date]) AS first_day_of_week,                     from ##data d;

第一条指令将星期一定义为一周的第一天。那么, date_part() 为您提供一个表示一周中某一天的数字,您可以使用该数字将日期偏移到上一个星期一。

j9per5c4

j9per5c42#

您可以使用iso\u week对每周数据进行分组,如下所示。你可以在这里查看isou如何解释你的数据

select *, datepart(ISO_WEEK,Date) WeekNumber
from your_table

对于您确切需要的输出,您可以尝试下面的逻辑-
此处演示

select *, 
DATEADD(
    DD,
    -
    CASE 
        WHEN datepart(weekday,date) = 1 THEN 7 
        ELSE datepart(weekday,date) - 1
    END + 1,
    DATE
)
from your_table

相关问题