【问题标题】:SQL Date intelligence: filtering data by seconds ran from last known valid resultSQL 日期智能:从最后一个已知的有效结果开始按秒过滤数据
【发布时间】:2018-08-09 01:01:56
【问题描述】:

帮助!我们正在尝试创建一个新列(Is Valid?)来重现下面的逻辑。

这是一个二进制结果:

  • 如果它是 ID 的第一个已知值,则为 1

  • 如果比该 ID 的前一个“1”晚 3 秒或更晚,则为 1

注意 1:这不是与之前记录的秒差

  • 如果比该 ID 的前一个“1”小于 3 秒,则为 0

注2:数据集中有很多ID

注3:原始数据集有ID和日期

附上数据和预期结果的PoC。

【问题讨论】:

    标签: sql postgresql date calculated-columns calculation


    【解决方案1】:

    您必须使用递归 CTE 来执行此操作,这非常昂贵:

    with tt as (
          select t.*, row_number() over (partition by id order by time) as seqnum
          from t
         ),     
         recursive cte as (
          select t.*, time as grp_start
          from tt
          where seqnum = 1
          union all
          select tt.*,
                 (case when tt.time < cte.grp_start + interval '3 second'
                       then tt.time
                       else tt.grp_start
                   end)
          from cte join
               tt
               on tt.seqnum = cte.seqnum + 1
         )
    select cte.*,
           (case when grp_start = lag(grp_start) over (partition by id order by time)
                 then 0 else 1
            end) as isValid
    from cte;
    

    【讨论】:

    • 谢谢戈登!您知道克服 Amazon Redshift 对递归 CTE 的限制的方法吗?
    • @mfulvio 。 . .我认为你不能在 Redshift 中做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2016-07-27
    • 2013-09-14
    相关资源
    最近更新 更多