[英]SQL query to check if there are records in the database of 6 consecutive 'Sundays'
我需要建立一個查詢來檢查數據庫中是否有連續 6 個“星期日”的記錄
SELECT DISTINCT ST1.DATAPU, ST1.NUMCAD, TO_CHAR(ST1.DATAPU, 'DAY') AS DIA
FROM SENIOR.R066SIT ST1
WHERE ST1.DATAPU BETWEEN '01/01/22' AND '23/11/22'
AND ST1.NUMCAD = 10
AND TO_CHAR(ST1.DATAPU, 'FMDAY') = 'DOMINGO' -->which is SUNDAY in English
ORDER BY ST1.DATAPU ASC
通過上面的查詢,我得到了如下圖所示的記錄結果
從Oracle 12開始,可以使用MATCH_RECOGNIZE
進行逐行模式分析:
SELECT *
FROM (
SELECT DISTINCT
TRUNC(DATAPU) AS datapu,
NUMCAD,
TO_CHAR(DATAPU,'DAY') AS DIA
FROM SENIOR.R066SIT
WHERE DATAPU BETWEEN DATE '2022-01-01' AND DATE '2022-11-23'
AND NUMCAD = 10
AND TRUNC(DATAPU) - TRUNC(DATAPU, 'IW') = 6 -- Sunday
)
MATCH_RECOGNIZE(
ORDER BY datapu
ALL ROWS PER MATCH
PATTERN (first_week consecutive_week{5,})
DEFINE
consecutive_week AS PREV(datapu) + INTERVAL '7' DAY = datapu
)
其中,對於示例數據:
CREATE TABLE senior.r066sit(numcad, datapu) AS
SELECT 10, DATE '2022-01-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 5*7
UNION ALL
SELECT 10, DATE '2022-04-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 7*7
UNION ALL
SELECT 10, DATE '2022-08-01' + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 7*7;
輸出:
數據普 | 數字計算機輔助設計 | 直徑 |
---|---|---|
2022-04-03 00:00:00 | 10 | 星期日 |
2022-04-10 00:00:00 | 10 | 星期日 |
2022-04-17 00:00:00 | 10 | 星期日 |
2022-04-24 00:00:00 | 10 | 星期日 |
2022-05-01 00:00:00 | 10 | 星期日 |
2022-05-08 00:00:00 | 10 | 星期日 |
2022-05-15 00:00:00 | 10 | 星期日 |
2022-08-07 00:00:00 | 10 | 星期日 |
2022-08-14 00:00:00 | 10 | 星期日 |
2022-08-21 00:00:00 | 10 | 星期日 |
2022-08-28 00:00:00 | 10 | 星期日 |
2022-09-04 00:00:00 | 10 | 星期日 |
2022-09-11 00:00:00 | 10 | 星期日 |
2022-09-18 00:00:00 | 10 | 星期日 |
Oracle 12之前,可以在嵌套子查詢中使用多個解析函數:
SELECT datapu, numcad,
TO_CHAR(datapu, 'fmDAY') AS dia
FROM (
SELECT datapu, numcad,
COUNT(*) OVER (PARTITION BY grp) AS grp_size
FROM (
SELECT datapu, numcad,
SUM(consecutive) OVER (ORDER BY datapu) AS grp
FROM (
SELECT datapu, numcad,
CASE datapu - LAG(datapu) OVER (ORDER BY datapu)
WHEN 7
THEN 0
ELSE 1
END AS consecutive
FROM (
SELECT DISTINCT
TRUNC(DATAPU) AS datapu,
NUMCAD
FROM SENIOR.R066SIT
WHERE DATAPU BETWEEN DATE '2022-01-01' AND DATE '2022-11-23'
AND NUMCAD = 10
AND TRUNC(DATAPU) - TRUNC(DATAPU, 'IW') = 6 -- Sunday
)
)
)
)
WHERE grp_size >= 6;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.