Разбить диапазон дат на недели в sql - PullRequest
1 голос
/ 03 апреля 2020

Учитывая таблицу под названием Project, мне нужен список team_id, которые выигрывали, по крайней мере, награду каждую неделю в течение последних 3 месяцев.

launch_date team_id project_name
2019-01-01   123      A
2019-01-01   345      B
2019-01-01   357      C
2019-01-09   123      D
2019-01-08   345      E
2019-01-21   123      F

project_name    award
A                Y
B                N
C                Y
D                Y
E                N
F                Y

. Последние 3 месяца могут быть достигнуты при условии ниже, где условие, но как мне разбить дату запуска на еженедельные интервалы

where launch_date >= sysdate - 90

При заданных данных ответом должен быть идентификатор команды 123

1 Ответ

1 голос
/ 03 апреля 2020

В данных выборки вы дали только 21 день данных вместо 3 месяцев.

Вы можете узнать общее количество недель и дату начала их недели, которые затем можно сравнить с данными таблицы. чтобы проверить, выигрывается ли команда за каждую неделю, следующим образом:

SQL> --SAMPLE DATA
SQL> with teams (launch_date, team_id, project_name)
  2  as
  3  (SELECT DATE'2019-01-01', 123, 'A' FROM DUAL UNION ALL
  4  SELECT DATE'2019-01-01', 345, 'B' FROM DUAL UNION ALL
  5  SELECT DATE'2019-01-01', 357, 'C' FROM DUAL UNION ALL
  6  SELECT DATE'2019-01-09', 123, 'D' FROM DUAL UNION ALL
  7  SELECT DATE'2019-01-08', 345, 'E' FROM DUAL UNION ALL
  8  SELECT DATE'2019-01-21', 123, 'F' FROM DUAL),
  9  AWARDS(project_name, award)
 10  AS
 11  (SELECT 'A','Y' FROM DUAL UNION ALL
 12  SELECT 'B','N' FROM DUAL UNION ALL
 13  SELECT 'C','Y' FROM DUAL UNION ALL
 14  SELECT 'D','Y' FROM DUAL UNION ALL
 15  SELECT 'E','N' FROM DUAL UNION ALL
 16  SELECT 'F','Y' FROM DUAL),
 17  -- YOUR QUERY START FROM HERE
 18  -- WITH
 19  WKS(DT) AS
 20  (SELECT DISTINCT TRUNC(DATE '2019-01-21' - LEVEL + 1, 'W')
 21  FROM DUAL CONNECT BY LEVEL <= 21
 22  )
 23  SELECT T.TEAM_ID
 24    FROM WKS W
 25    LEFT JOIN TEAMS T ON W.DT = TRUNC(T.LAUNCH_DATE, 'W')
 26    LEFT JOIN AWARDS A ON A.PROJECT_NAME = T.PROJECT_NAME
 27  WHERE A.AWARD = 'Y'
 28  GROUP BY T.TEAM_ID
 29  HAVING COUNT(1) = ( SELECT COUNT(1) FROM WKS);

   TEAM_ID
----------
       123

SQL>

В WKS cte за 3 месяца, вам нужно заменить

WKS(DT) AS
 (SELECT DISTINCT TRUNC(DATE '2019-01-21' - LEVEL + 1, 'W')
  FROM DUAL CONNECT BY LEVEL <= 21
 )

на

WKS(DT) AS
( SELECT DISTINCT TRUNC(sysdate - LEVEL + 1, 'W')
 FROM DUAL CONNECT BY LEVEL <= trunc(sysdate) - add_months(trunc(sysdate), -3 
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...