SQL Query Design - Sum / Count, только если действие произошло перед другим действием в наборе - PullRequest
0 голосов
/ 05 октября 2018

У меня есть два набора:

SET 1 (данные образца):

actionid | actiontime
---------+---------------------
123      | 2018-10-02 00:01:00
456      | 2018-10-02 00:10:00

SET 2 (данные образца):

actionid | actionsteps | actionsteptime      | outputnumber
---------+-------------+---------------------+---------------
123      |  step a     | 2018-10-02 00:02:00 |    1
123      |  step b     | 2018-10-02 00:03:00 |    NULL
123      |  step a     | 2018-10-02 00:04:00 |    2
123      |  step c     | 2018-10-02 00:05:00 |    NULL
123      |  step a     | 2018-10-02 00:06:00 |    1
456      |  step a     | 2018-10-02 00:11:00 |    4
456      |  step a     | 2018-10-02 00:12:00 |    5
456      |  step b     | 2018-10-02 00:13:00 |    NULL
456      |  step a     | 2018-10-02 00:12:00 |    7

Возможные значения дляшаги в SET 2 - это «шаг a», «шаг b» или «шаг c».

Только «шаг a» в SET 2 будет иметь выходной номер.

Мне нужно вычислить иSUM и COUNT выходного номера для каждого actionid, но условие только для значений «шага a», у которого время действия меньше, чем первое время действия «шага b» (что означает, что в SET 2 есть какой-либо «шаг b» для actionidзатем проигнорируйте это и любые действия после этого при вычислении СУММЫ И СЧЕТА).Если для actionid нет «шага b», то это означает, что это обычная сумма и счет.Строки с «шагом c» не влияют на вычисление SUM & COUNT.

Таким образом, ожидаемый результат в этом случае составляет

actionid | count| sum
---------+---------------------
123      | 1    |  1
456      | 2    |  9

Я почесываю голову справа от функции JOIN & Analyticиспользовать.Есть указатели?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018
SELECT temp.actionid, temp.actionsteps, SUM(outputnumber) sum_outputnumber, COUNT(outputnumber) count_outputnnumber FROM temp 
JOIN (SELECT temp.actionid, COUNT(outputnumber) count_outputnumber FROM temp 
GROUP BY actionid ) a 
ON a.actionid=temp.actionid 
GROUP BY temp.actionid, temp.actoinsteps
HAVING SUM(outputnumber) IS NOT NULL 
0 голосов
/ 05 октября 2018

Вы можете использовать оконные функции для расчета времени шага действия для "b" с.Остальное только фильтрация и агрегация:

select actionid, count(*), sum(outputnumber)
from (select s2.*, max(case when s2.actionstep = 'step b' then s2.actionsteptime end) over (partition by s2.actionid) as b_ast
      from set2 s2
     ) s2
where actionstep < b_ast or b_ast is null
group by actionid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...