每當磁區內的值發生變化時,我正在尋找一種將資料集拆分為多個部分的方法。請注意,每個值切換都是一個新部分 - 如果值切換回與之前部分相同的值。
嘗試使用一些虛擬資料來說明:
架構 (MySQL v8.0)
CREATE TABLE test (
id INT AUTO_INCREMENT PRIMARY KEY,
group_id INT,
date DATE,
value VARCHAR(255)
);
INSERT INTO test (group_id, date, value) VALUES
(2, '2022-03-12', 'D'),
(2, '2022-03-15', 'C'),
(1, '2022-03-27', 'B'),
(1, '2022-02-01', 'A'),
(2, '2022-03-10', 'D'),
(1, '2022-05-01', 'C'),
(2, '2022-01-19', 'C'),
(1, '2022-01-18', 'A'),
(2, '2022-04-12', 'D'),
(1, '2022-04-08', 'A');
查詢 #1
SELECT
id,
group_id,
date,
value,
'' as section # This is the one that I don't know how to calculate
FROM test ORDER BY group_id, date;
我想要的結果(該部分計算不正確):
| ID | group_id | 日期 | 價值 | 部分 |
|---|---|---|---|---|
| 8 | 1 | 2022-01-18 | 一個 | 1 |
| 4 | 1 | 2022-02-01 | 一個 | 1 |
| 3 | 1 | 2022-03-27 | 乙 | 2 |
| 10 | 1 | 2022-04-08 | 一個 | 3 |
| 6 | 1 | 2022-05-01 | C | 4 |
| 7 | 2 | 2022-01-19 | C | 5 |
| 5 | 2 | 2022-03-10 | D | 6 |
| 1 | 2 | 2022-03-12 | D | 6 |
| 2 | 2 | 2022-03-15 | C | 7 |
| 9 | 2 | 2022-04-12 | D | 8 |
在 DB Fiddle 上查看
請注意,我的主要問題是我無法磁區,(group_id, value)因為每當值更改時它都是一個新部分,無論它是否更改回早期值(A例如,參見值)。
uj5u.com熱心網友回復:
您會得到一個數字,該數字通過從該 group_id 到目前為止的總出現次數中減去該值在 group_id 中出現的次數來區分 group_id 的值出現的時間;稍加思考就會告訴你這個值在一系列相同的值中總是相同的,并且總是與在不同時間出現的相同值不同。
根據該數字,您可以計算您的連續部分編號。可能有一種方法可以直接執行此操作(使用更少的子查詢),但我必須使用中間步驟來獲取 group_id 的特定值運行開始的日期。
SELECT id, group_id, date, value,
dense_rank() over (partition by group_id order by group_value_incidence_start) section
FROM (
SELECT id, group_id, date, value,
min(date) over (partition by group_id, value, group_value_incidence) group_value_incidence_start
FROM (
SELECT id, group_id, date, value,
count(1) over (partition by group_id order by date) -
count(1) over (partition by group_id, value order by date) group_value_incidence
FROM test
) group_value_indidences
) group_value_incidence_starts
ORDER BY group_id, section
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/496283.html
