【发布时间】:2021-10-28 13:46:56
【问题描述】:
我有一个包含 ID 和日期列的表。
表 A:
| ID | Date |
|---|---|
| 24 | 2019-10-29 |
| 24 | 2019-10-30 |
| 24 | 2019-10-31 |
| ..... | .... |
我需要添加一个名为“Week_Num”的列,这样:
- 如果有新的“ID”并且第一个日期从星期二开始(例如:ID 24 中的 2019 年 10 月 29 日是星期二),则该周将从 1 开始
- 无论 7 天是否结束,一周总是会在星期六结束,只有一个例外(见第 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 谢谢!更正了
-
如果日期开始日期不是星期日、星期一或星期二怎么办?也许在星期四?还是周六?
-
目前的业务逻辑是日期总是从星期二开始,除了少数例外情况可以在星期日开始。