【问题标题】:bigquery get highest possible steps group by colbigquery 按 col 获得最高可能的步骤组
【发布时间】:2020-04-20 22:02:02
【问题描述】:

我对基于列迭代计算行数有疑问

我的桌子是这样的

time  | steps  | name
13:02 | 0      | a
13:03 | 0      | a
13:04 | 1      | a
13:05 | 0      | a
13:07 | 1      | a
13:10 | 1      | a
13:12 | 2      | a
13:04 | 0      | b
13:06 | 0      | b
13:12 | 1      | b
13:14 | 2      | b
13:19 | 3      | b
13:14 | 0      | b
13:19 | 3      | b

从上表中,我想按名称获得尽可能高的步骤。但必须满足以下条件:

  1. 按名称执行的步骤必须是连续的(例如:0,1,2,3 返回 0,1,2,3;0,1,2,4 返回 0,1,2)
  2. 每个步骤都必须按时间顺序进行
  3. 如果可能有超过 1 条记录,则选择任何值(例如:0,1,1,2 返回 0,ANY(1,1),2)

我要找的表是

time  | steps  | name
13:05 | 0      | a
13:07 | 1      | a
13:12 | 2      | a
13:06 | 0      | b
13:12 | 1      | b
13:14 | 2      | b
13:19 | 3      | b

有什么方法可以在 bigquery 中做到这一点?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    首先删除重复项。然后确定“下一步”(按时间)是您期望的行。

    以下几乎有效:

    select t.*
    from (select min(time) as time, steps, name,
                 lead(steps) over (partition by name order by min(time)) as next_step
          from yourtable t
          group by steps, name
         ) t
    where next_step = step + 1;
    

    但是,您需要最小集。为此,您还需要匹配行号。事实证明,这个条件是充分的:

    select t.*
    from (select min(time) as time, steps, name,
                 row_number() over (partition by name order by min(time)) as seqnum
          from yourtable t
          group by steps, name
         ) t
    where step = seqnum - 1;
    

    【讨论】:

    • 我认为这不会保留序列。例如,如果您在 'a' 的 2 值之前插入 0,您仍然会得到 0、1、2。@R Herpradipto Adiansyah,序列中会出现中断吗?
    猜你喜欢
    • 2021-07-22
    • 2013-11-21
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多