Как найти число месяцев недели, включая два месяца - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть таблица, которая содержит num_client, день, неделю, и я хочу рассчитать количество клиентов в каждой неделе Вот некоторые данные в таблице:

num_client,   day,  week
1       01/01/2018     1
2       01/01/2018     1
.
.
.
1       09/01/2018     2
3       10/01/2018     2
.
.
.
.
1       28/01/2018     5
1       01/02/2018     5
2       01/02/2018     5
5       01/02/2018     5

. , , И так далее ..

Я группирую пользователей по функциям, чтобы сделать это, и все работает нормально. Проблема в том, что, когда я пытаюсь добавить месяц недели в запросе агрегации, есть недели, которые находятся в слишком разделенных месяцах, как и 5-я неделя 2018 года, она включает два месяца, январь и февраль.

Итак, я подумал о том, чтобы увидеть количество дней: если в неделе 5 больше дней в феврале, чем в январе, то месяц для недели 5 - это февраль. И это на каждый год. Есть ли у них какая-нибудь динамическая функция, чтобы сделать это в оракуле?

1 Ответ

0 голосов
/ 01 ноября 2018

Вот способ создания списка дат и их соответствующих значений недели и недели-месяца на основе сказанной вами логики (т. Е. Если последняя дата в неделе является 1-й, 2-й, 3-й или 4-й из месяц, неделя относится к предыдущему месяцу):

WITH week_months AS (SELECT dt,
                            dt_week_start,
                            dt_week_end,
                            to_number(to_char(dt, 'ww')) week_no,
                            to_number(CASE WHEN TRUNC(dt_week_start, 'mm') != TRUNC(dt_week_end, 'mm') AND to_char(dt_week_end, 'dd') < '05' THEN to_char(dt_week_start, 'mm')
                                           ELSE to_char(dt_week_end, 'mm')
                                      END) mnth
                     FROM   (SELECT to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL dt,
                                    trunc(to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL, 'ww') dt_week_start,
                                    trunc(to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL, 'ww') + 6 dt_week_end
                             FROM   dual
                             CONNECT BY LEVEL <= 400))
SELECT *
FROM   week_months
ORDER BY dt;

Вы можете использовать это динамически (вам нужно изменить внутренний выбор в подзапросе week_months, чтобы выбрать интересующие вас даты; здесь я только что выбрал 400 дней с 1 января 2018 года, но вам может понадобиться минимальные / максимальные даты в вашей таблице), но в зависимости от того, как часто выполняется запрос, вам может быть лучше заполнить таблицу и использовать ее для соединения с другими таблицами.

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