簡體   English   中英

SQL 查詢數據庫中是否有連續6個'星期天'的記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM