【问题标题】:Creating custom week number in sql在sql中创建自定义周数
【发布时间】:2021-10-28 13:46:56
【问题描述】:

我有一个包含 ID 和日期列的表。

表 A:

ID Date
24 2019-10-29
24 2019-10-30
24 2019-10-31
..... ....

我需要添加一个名为“Week_Num”的列,这样:

  1. 如果有新的“ID”并且第一个日期从星期二开始(例如:ID 24 中的 2019 年 10 月 29 日是星期二),则该周将从 1 开始
  2. 无论 7 天是否结束,一周总是会在星期六结束,只有一个例外(见第 3 点)
  3. 如果有新的“ID”并且第一个日期在星期二之前开始(例如:ID 25 中的 2020 年 10 月 25 日是星期日),则该周将从 0 开始,一旦到达星期二,week_num 将变为 1。

预期输出:

ID Date Day_Of_Week Week_Num
24 2019-10-29 Tue 1
24 2019-10-30 Wed 1
24 2019-10-31 Thur 1
24 2019-11-01 Fri 1
24 2019-11-02 Sat 1
24 2019-11-03 Sun 2
24 2019-11-04 Mon 2
24 2019-11-05 Tues 2
24 2019-11-06 Wed 2
24 2019-11-07 Thurs 2
24 2019-11-08 Fri 2
24 2019-11-09 Sat 2
24 .......... . ..
24 2020-03-14 . ..
25 2020-10-25 Sun 0
25 2020-10-26 Mon 0
25 2020-10-27 Tue 1
25 2020-10-28 Wed 1
25 2020-10-29 Thur 1
25 2020-10-30 Fri 1
25 2020-10-31 Sat 1

到目前为止我所拥有的:

select 
distinct ID,min(Date) over (partition by ID order by date) as firstTuesdayOfSeason
from
TableA
group by ID,Date
having datepart(weekday,Date)=3

获取每个新 ID 的第一个星期二并给出以下输出:

ID firstTuesdayOfSeason
24 2019-10-29
25 2020-10-27

我正在考虑将此表与表 A(以 ID、日期作为列的表)连接,但我不知道如何实现奇怪的星期六逻辑。

【问题讨论】:

  • 为什么不直接使用 ISO 周数然后添加偏移量?
  • 您必须确保提供正确的样本数据和/或预期输出。目前,您的预期输出在 ID 行之前的最后 5 行中与 ID 显示相同的 Date
  • @FanoFN 谢谢!更正了
  • 如果日期开始日期不是星期日、星期一或星期二怎么办?也许在星期四?还是周六?
  • 目前的业务逻辑是日期总是从星期二开始,除了少数例外情况可以在星期日开始。

标签: mysql sql


【解决方案1】:

这可能对你有用。

查找每个 ID 的最小日期,偏移到星期二,并针对最小日期使用每行的 date-diff 计算

select a.ID, a.Date, weekday(a.Date), greatest(0, 1 + floor((datediff(a.Date, b.since) - b.off) / 7)) week_num
from TableA a 
join (
  select ID, min(Date) As since, (case when weekday(min(Date)) > 1 then 8 - weekday(min(Date)) else 1 - weekday(min(Date)) end) off
  from TableA
  group by ID
) b ON a.ID = b.ID
order by a.ID, a.Date

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=657c96465338a398ced73bc256ff92c0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多