我有一個這樣的用戶表,
name week_no year_no
fb 5 2021
twitter 1 2022
twitter 2 2022
twitter 3 2022
twitter 7 2022
youtube 21 2022
我想找到在同一年內登錄 >= 連續 3 周的用戶名。每年的周數都是唯一的。例如,在上表中我們可以看到用戶在同一年twitter登錄,從而滿足我要查找的條件。week_no: 1, 2, 32022
我正在尋找的輸出,
name year_no
twitter 2022
您可以使用創建示例表,
CREATE TABLE test (
name varchar(20),
week_no int,
year_no int
);
INSERT INTO test (name, week_no, year_no)
VALUES ('fb', 5, 2021),
('twitter', 1, 2022),
('twitter', 2, 2022),
('twitter', 3, 2022),
('twitter', 7, 2022),
('youtube', 21, 2022);
我是 SQL 語言的新手,我讀到 group by 可以實作這一目標,有人可以幫助我們必須使用什么功能/查詢來實作同樣的目標。
select * from test group by year_no, name;
感謝您提前提供任何幫助。
uj5u.com熱心網友回復:
一個簡單的解決方案,適用于每個 MySQL 版本,無需使用 Windows 功能。加入同一張桌子3次
SELECT t1.name,t1.year_no
FROM test t1
INNER JOIN test t2 ON t1.name=t2.name AND t1.year_no=t2.year_no
INNER JOIN test t3 ON t1.name=t3.name AND t1.year_no=t3.year_no
WHERE t2.week_no = t1.week_no 1
AND t3.week_no = t1.week_no 2
https://dbfiddle.uk/XjeXKUFE
uj5u.com熱心網友回復:
您可以為同一年的連續幾周定義一個唯一的組,并將它們聚合如下:
SELECT name, year_no
FROM
(
SELECT *,
week_no -
ROW_NUMBER() OVER (PARTITION by name, year_no ORDER BY week_no) grp
FROM test
) T
GROUP BY name, year_no, grp
HAVING COUNT(*) >= 3
ORDER BY name, year_no
看一個演示。
uj5u.com熱心網友回復:
視窗函式版本。
演示
WITH cte AS (
SELECT
name,
week_no,
year_no,
lag(week_no) OVER (PARTITION BY name,
year_no ORDER BY year_no,
week_no) AS lag,
lead(week_no) OVER (PARTITION BY name,
year_no ORDER BY year_no,
week_no) AS lead
FROM
testuser
)
SELECT DISTINCT
name,
year_no
FROM
cte
WHERE
lead lag = 2 * week_no;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535371.html
標籤:数据库数据库
上一篇:mysql結果由多行錯誤組成
