SQL-запрос для создания поля на основе дат - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть набор данных, в котором идентификатор последовательно проходит этапы от A до D (от A до B, от B до C и от C до D).

У меня есть метки времени, которые отслеживают, когда идентификатор входит в конкретную стадию. Вот как выглядят мои данные

enter image description here

Поэтому я заинтересован в создании поля под названием «Статус», который показывает число B, C, D, преобразованное на основе временной метки A

Например;

В месяце Aug'19 Число 'A's= 7

Число 'B', преобразованное, когда отметка времени A равна 19 августа (независимо от даты в поле Date_B) = 5

Theчисло 'C', преобразованное, когда отметка времени A - 19 августа (независимо от даты в поле Date_C) = 5

Число 'D', преобразованное, когда отметка времениA - это Aug'19 (независимо от даты в Date_D) = 5

Я пытался использовать union all, , но его дает мне «Status» в реальном временизначение времени 'date_B' под идентификатором 1 получает дату 19 сентября, а не 19 августа. Это запрос, который я использовал;

SELECT id,
CAST (Date_A AS DATE) AS 'Pivot Date',
'A' AS 'Status'
FROM table1

UNION ALL

SELECT id,
CAST (Date_B AS DATE) AS 'Pivot Date',
'B' AS 'Status'
FROM table1

UNION ALL

SELECT id,
CAST (Date_C AS DATE) AS 'Pivot Date',
'C' AS 'Status'
FROM table1

UNION ALL

SELECT id,
CAST (Date_D AS DATE) AS 'Pivot Date',
'D' AS 'Status'
FROM table1

Может ли кто-нибудь указать мне правильное направление?

Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2019

Я не совсем уверен, если это то, что вы хотите, но попробуйте это:

SELECT
    *, -- or only id or whatever
    COUNT(date_a) OVER (PARTITION BY date_trunc('month', date_a)) AS a_of_the_month,
    COUNT(date_b) OVER (PARTITION BY date_trunc('month', date_a)) AS already_converted_to_b,
    COUNT(date_c) OVER (PARTITION BY date_trunc('month', date_a)) AS already_converted_to_c,
    COUNT(date_d) OVER (PARTITION BY date_trunc('month', date_a)) AS already_converted_to_d
FROM table1;

Возможно, вы хотели только месяцы и ваши цифры:

SELECT
    date_trunc('month', date_a),
    COUNT(date_a) AS a_of_the_month,
    COUNT(date_b) AS already_converted_to_b,
    COUNT(date_c) AS already_converted_to_c,
    COUNT(date_d) AS already_converted_to_d
FROM table1
GROUP BY date_trunc('month', date_a);

В обоих случаяхВы также можете заменить COUNT(date_a) на COUNT(*), если date_a должен быть установлен всегда.

...