Как определить номера недель в квартале, когда квартал начинается в середине недели? - PullRequest
0 голосов
/ 09 января 2019

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

Следующий запрос, который я использовал, и он прекрасно работал последние 2 квартала, но теперь он больше не работает должным образом, я полагаю, потому что текущий квартал начался в середине недели во вторник (01.01.2009).

, 1 + TRUNC((CALL_DATE - TRUNC(CALL_DATE, 'Q'))/7) as "Week in Quarter"
, TO_CHAR(TRUNC(CALL_DATE, 'IW'), 'MM/DD/YY') ||' - '|| TO_CHAR(TRUNC(CALL_DATE, 'IW') + 4, 'MM/DD/YY') as  "Week Dates"

Для звонков, завершенных в понедельник (07.01.2009), это отражается как «Неделя 1» в столбце «Неделя в квартале», если на самом деле это следует считать «Неделей 2».

Кроме того, столбец «Даты недели» помечает первую неделю квартала как «12/31/18 - 01/04/19», когда вместо этого я хочу, чтобы она была «01/01/19 - 01 /». 04/19' .

Как мне изменить этот код, чтобы он работал для всех финансовых кварталов, независимо от того, в какой день недели начинается квартал? Как будто мне нужен случай, который по-разному рассчитывает первую неделю квартала?

1 Ответ

0 голосов
/ 09 января 2019

Вы можете использовать ( TRUNC( call_date, 'IW' ) - TRUNC( TRUNC( call_date, 'Q' ), 'IW' ) ) / 7 + 1, чтобы найти номер недели в квартале.

Установка Oracle :

CREATE TABLE table_name ( call_date ) AS
SELECT DATE '2018-12-20' + LEVEL - 1
FROM DUAL
CONNECT BY LEVEL <= 20;

Запрос

SELECT call_date,
       ( TRUNC( call_date, 'IW' ) - TRUNC( TRUNC( call_date, 'Q' ), 'IW' ) ) / 7 + 1 
         AS week_of_quarter,
       GREATEST(
         TRUNC( call_date, 'IW' ),
         TRUNC( call_date, 'Q' )
       ) AS start_of_quarter_week,
       LEAST(
         TRUNC( call_date, 'IW' ) + INTERVAL '6' DAY,
         ADD_MONTHS( TRUNC( call_date, 'Q' ), 3 ) - INTERVAL '1' DAY
       ) AS end_of_quarter_week
FROM   table_name;

выход

CALL_DATE | WEEK_OF_QUARTER | START_OF_QUARTER_WEEK | END_OF_QUARTER_WEEK
:-------- | --------------: | :-------------------- | :------------------
20-DEC-18 |              12 | 17-DEC-18             | 23-DEC-18          
21-DEC-18 |              12 | 17-DEC-18             | 23-DEC-18          
22-DEC-18 |              12 | 17-DEC-18             | 23-DEC-18          
23-DEC-18 |              12 | 17-DEC-18             | 23-DEC-18          
24-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
25-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
26-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
27-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
28-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
29-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
30-DEC-18 |              13 | 24-DEC-18             | 30-DEC-18          
31-DEC-18 |              14 | 31-DEC-18             | 31-DEC-18          
01-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
02-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
03-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
04-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
05-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
06-JAN-19 |               1 | 01-JAN-19             | 06-JAN-19          
07-JAN-19 |               2 | 07-JAN-19             | 13-JAN-19          
08-JAN-19 |               2 | 07-JAN-19             | 13-JAN-19          

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...