ФОН:
У меня есть данные, которые выглядят следующим образом
date src subsrc subsubsrc param1 param2
2020-02-01 src1 ksjd dfd8 47 31
2020-02-02 src1 djsk zmnc 44 95
2020-02-03 src2 skdj awes 92 100
2020-02-04 src2 mxsf kajs 80 2
2020-02-05 src3 skdj asio 46 53
2020-02-06 src3 dekl jdqo 19 18
2020-02-07 src3 dskl dqqq 69 18
2020-02-08 src4 sqip riow 64 46
2020-02-09 src5 ss01 qwep 34 34
Я пытаюсь агрегировать за все время, последние 30 дней и последние 90 дней ( без скользящей суммы)
Таким образом, мои окончательные данные будут выглядеть так:
src subsrc subsubsrc p1_all p1_30 p1_90 p2_all p2_30 p2_90
src1 ksjd dfd8 7 1 7 98 7 98
src1 djsk zmnc 0 0 0 0 0 0
src2 skdj awes 12 12 12 4 4 4
src2 mxsf kajs 6 6 6 31 31 31
src3 skdj asio 0 0 0 0 0 0
src3 dekl jdqo 20 20 20 17 17 17
src3 dskl dqqq 3 3 3 4 4 4
src4 sqip qwep 0 0 0 0 0 0
src5 ss01 qwes 15 15 15 2 2 2
О ДАННЫХ:
- Это только фиктивная данные и, следовательно, неверны.
- В моих данных десятки тысяч строк.
- Существует дюжина столбцов sr c, составляющих ключ для таблицы.
- Есть дюжина столбцов параметров, которые я должен суммировать для 30 и 90 и все время.
- Также в столбцах параметров есть нулевые значения.
- Также может быть несколько строки для того же дня и столбца sr c.
- Новые данные добавляются каждый день, и, вероятно, запрос будет выполняться каждый день, чтобы получить последние 30, 90 данных за все время.
ЧТО Я ПОПЫТАЛ:
Вот что я придумал:
SELECT src, subsubsrc, subsubsrc,
SUM(param1) as param1_all,
SUM(CASE WHEN DATE_DIFF(CURRENT_DATE,date,day) <= 30 THEN param1 END) as param1_30,
SUM(CASE WHEN DATE_DIFF(CURRENT_DATE,date,day) <= 90 THEN param1 END) as param1_90,
SUM(param2) as param2_all,
SUM(CASE WHEN DATE_DIFF(CURRENT_DATE,date,day) <= 30 THEN param2 END) as param2_30,
SUM(CASE WHEN DATE_DIFF(CURRENT_DATE,date,day) <= 90 THEN param2 END) as param2_90,
FROM `MY_TABLE`
GROUP BY src
ORDER BY src
Это на самом деле работает, но Я могу предвидеть, как долго будет выполняться этот запрос для нескольких источников и даже для большего количества столбцов параметров.
Я пробовал что-то, что называется " Фильтрованные агрегатные функции (или ручное управление) " объяснил ЗДЕСЬ . Но я не могу понять / реализовать это для моего случая.
Также я просмотрел десятки ответов, и большинство из них используют суммы за каждый день ИЛИ сложные случаи этого базового расчета c. Возможно, я не ищу его правильно.
Как видите, я новичок ie в SQL и буду очень признателен за любую помощь.