代码之家  ›  专栏  ›  技术社区  ›  WhatsUp

SQL查询设计-仅当一个操作发生在集合中另一个操作之前时求和/计数

  •  0
  • WhatsUp  · 技术社区  · 6 年前

    我有两套:

    集合1(样本数据):

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

    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
    

    集合2中actionsteps的可能值为“步骤a”或“步骤b”或“步骤c”。

    我需要计算每个actionid的outputnumber并求和和和计数,但条件仅适用于actionsteptime小于“step b”的第一个actionsteptime的“step a”的值(这意味着如果actionid的集合2中有任何“step b”,则在计算和时忽略该值和之后的任何actionsteps&计数)。如果actionid没有“步骤b”,则表示它是一个正常的和&数一数。带有“步骤c”的行不影响总和;计数计算。

    所以这个例子中的预期输出是

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    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;
    
        2
  •  0
  •   lije    6 年前
    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