MYSQL Невозможно сосчитать вхождение определенного значения в диапазон дат - PullRequest
1 голос
/ 08 марта 2019

Итак, есть номер счета и мы ежедневно получаем информацию об их платежах. Предположим, у нас есть информация за 1 год до сегодняшнего дня, то есть 08 марта / 2019, я бы хотел подсчитать, сколько раз он / она переплатил за последнюю 1 неделю. Я использовал оконную функцию mysql, но по какой-то причине она не работает

@ GMB. Пример данных будет выглядеть следующим образом: предположим, что для этого аккаунта у нас есть информация с последнего марта 2018 года. Я просто хочу узнать, сколько раз paid_status = переплачено с последней даты, которая у меня есть в моем файле на сегодняшний день - 08 / март / 2019 и предыдущие 7 дней, 14 дней, 1 месяц или любой срок по моему выбору. Ваш запрос будет жестко закодирован только на 7 дней.

ACCOUNT_ID paid_status amt dte
-----------------------
1234      overpaid   100 01/March/2018
.
.
.
1234      overpaid   120 01/March/2019
1234      not paid   0   02/March/2019
1234      overpaid   110 03/March/2019
1234      overpaid   120 04/March/2019
1234      overpaid   130 05/March/2019
1234      overpaid   120 06/March/2019
1234      overpaid   120 07/March/2019
1234      overpaid   121 08/March/2019

Запрос:

,COUNT(CASE WHEN paid_status = 'OVERPAID' THEN 1 END)
 over (PARTITION BY ACCOUNT_ID
       ORDER BY DTE ROWS BETWEEN 7 PRECEDING AND UNBOUNDED FOLLOWING
 ) AS num_times_overpaid_week1

Вывод должен быть таким (не включая сегодняшнюю информацию):

account_id num_times_overpaid_week1
1234               6

В то время как я получаю несколько строк для одного и того же account_id, и это не совсем правильно вычисляет поле

1 Ответ

0 голосов
/ 08 марта 2019

Из ваших примеров данных кажется, что вы ищете простой агрегированный запрос (нет необходимости в оконных функциях):

SELECT account_id, SUM(paid_status = 'OVERPAID') AS num_times_overpaid_week1
FROM mytable
WHERE dte >= CURRENT_DATE - INTERVAL 7 DAY
GROUP BY account_id

Выражение SUM(paid_status = 'OVERPAID') использует замечательную функцию MySQL, при которой условия возвращают 1, когда удовлетворены, и 0, если нет.


Примечание: если по какой-то причине вы хотите использовать оконные функции (возможно, для выполнения других вычислений), вам нужно будет использовать ROW_NUMBER() для ранжирования записей по дате и отфильтровывать только самые последние записи. за счет во внешнем запросе. Я думаю, что определение окна может быть в значительной степени упрощено:

SELECT *
FROM (
    SELECT 
        account_id, 
        SUM(paid_status = 'OVERPAID') OVER(PARTITION BY account_id) AS num_times_overpaid_week1,
        -- possibly other columns
        ROW_NUMBER() OVER(PARTITION BY account_id ORDER BY dte DESC) rn
    FROM mytable
    WHERE dte >= CURRENT_DATE - INTERVAL 7 DAY
) x WHERE rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...