我要回答的問題是如何為每個 ID 回傳正確的順序和周順序?例如,雖然每個 ID 的第一周確實總是從 1 開始(它是系列中的第一周),但它可能是系列中的下一個日期也可能在第一周內(例如,應該回傳1 再次)或者可能是第 3 周的日期(例如,應該回傳 3)。
到目前為止我寫的代碼是:
select distinct
row_number() over (partition by ID group by date) row_nums
,ID
,date
from table_a
它只是按 ID 回傳日期的運行計數,而不考慮該日期所在的周數。

但我正在尋找的是這個:

這里有一些設定代碼可以提供幫助:
CREATE TABLE random_table
(
ID VarChar(50),
date DATETIME
);
INSERT INTO random_table
VALUES
('AAA',5/14/2021),
('AAA',6/2/2021),
('AAA',7/9/2021),
('BBB', 5/25/2021),
('CCC', 12/2/2020),
('CCC',12/6/2020),
('CCC',12/10/2020),
('CCC',12/14/2020),
('CCC',12/18/2020),
('CCC',12/22/2020),
('CCC',12/26/2020),
('CCC',12/30/2020),
('CCC',1/3/2021),
('DDD',1/7/2021),
('DDD',1/11/2021)
uj5u.com熱心網友回復:
with adj as (
select *, dateadd(day, -1, "date") as adj_dt
from table_a
)
select
datediff(week,
min(adj_dt) over (partition by id),
adj_dt) 1 as week_logic,
id, "date"
from adj
這假設您對周的概念與@@datefirstset as Sunday 相對應。對于星期日到星期六的定義,您會在同一周找到 12/06/2020 和 12/10/2020,所以大概您想要類似星期一開始的東西(這似乎也與 12/02/ 的編號一致2020 年、2020 年 12 月 14 日和 2020 年 12 月 18 日。)我通過在周計算中向后滑動一天來進行補償。該步驟可以在沒有 CTE 的情況下行內處理,但也許它更清楚地說明了該方法。
uj5u.com熱心網友回復:
您的目標尚不清楚,但我認為您會從幾周的 Tally-Table 中受益,然后 LEFT JOIN 到您的源資料。這將為您提供每周的一行和源資料(如果存在)
uj5u.com熱心網友回復:
SELECT
CASE WHEN ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [date])=1 THEN 1
ELSE DATEPART(WK, (DATE) ) - DATEPART(WK, FIRST_VALUE([DATE]) OVER (PARTITION BY ID ORDER BY [date])) END PD,
ID,
CONVERT(VARCHAR(10), [date],120)
FROM random_table rt
ORDER BY ID,[date]
DBFIDDLE
輸出:
| PD | ID | (無列名) |
|---|---|---|
| 1 | AAA | 2021-05-14 |
| 3 | AAA | 2021-06-02 |
| 8 | AAA | 2021-07-09 |
| 1 | BBB | 2021-05-25 |
| 1 | CCC | 2020-12-02 |
| 1 | CCC | 2020-12-06 |
| 1 | CCC | 2020-12-10 |
| 2 | CCC | 2020-12-14 |
| 2 | CCC | 2020-12-18 |
| 3 | CCC | 2020-12-22 |
| 3 | CCC | 2020-12-26 |
| 4 | CCC | 2020-12-30 |
| -47 | CCC | 2021-01-03 |
| 1 | DDD | 2021-01-07 |
| 1 | DDD | 2021-01-11 |
- 日期格式為
YYYY-MM-DD. - 我會把
-47它留在這里,所以你可以自己修復它(作為練習)????
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/459840.html
