【问题标题】:postgres sql query to identify rows with same foreign key, but non consecutive datespostgresql 查询以识别具有相同外键但不连续日期的行
【发布时间】:2019-11-20 19:52:07
【问题描述】:

我有一个带有foreign_key_id 列和date 列的表。

对于具有相同外键的每一行,都有不同的日期,如果我 order by foreign_key_id, date ,则 90% 的时间所有日期都是连续的。

但也有一些极端情况,即多个条目具有相同的外键,但日期不连续。

试图想出一种简单的方法来识别所有没有连续日期的 foreign_key_id 。有什么想法吗?

我正在考虑加入一个生成的系列,以某种方式按轨道 ID 进行分区,但一直碰壁。我的 sql 查询编辑器不断崩溃,这增加了一些不相关的挫败感

编辑: 我最终做了一个 order by foreign_key_id, date ,将结果复制并粘贴到 excel 中,然后通过执行这种类型的逻辑公式找到我需要的内容: =IF( (B91 = B90), (F91 =(F90 + 1)) , 1 ) ,其中 b 是外键列,F 是日期列

但想知道是否可以在 sql 中完成类似的操作。这是我放弃并走向卓越时所拥有的:

select to_char(date_range.days, 'yyyy-mm-dd') as x
 , data.*
from (
          select generate_series('2019-04-30'::date,'2019-11-05'::date, '1 day')::date as days
        ) as date_range
left join(
 select foreign_key_id, date
 from table_a
 order by foreign_key_id, date
) data on data.date = date_range.days
where foreign_key_id is null

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    你可以这样做,当然。也不需要连接。使用LAG(datecol) OVER(PARTITION BY foreignkeycol ORDER BY datecol) 获取同一 fk 的前一行的日期,将其与当前日期进行比较以显示自该日期以来经过了多少间隔(天?分钟?),然后将其全部包装在 @987654322 中@ (或者无论您如何定义连续 - 如果连续对您来说是“每 2 天”,那么它将是任何没有 2 差异的东西)

    如果您希望两行都位于间隙的任一侧,请使用 LEAD(与 LAG 格式相同)获取下一个日期并计算两个差异,然后执行 WHERE difftoprev <> 1 or difftonext <>1 等

    看起来像这样(未经测试)

    WITH cte AS (
    
        SELECT foreignkeycol, datecol,
          LAG(datecol) OVER(PARTITION BY foreignkeycol ORDER BY datecol) as prevdate,
          LEAD(datecol) OVER(PARTITION BY foreignkeycol ORDER BY datecol) as nextdate
        FROM table
    )
    
    SELECT *
    FROM cte
    WHERE 
      DATE_PART('day', datecol - prevdate) <> 1 OR
      DATE_PART('day', nextdate - datecol) <> 1
    
    

    【讨论】:

      【解决方案2】:

      我会使用lead():

      select t.*
      from (select t.*,
                   lead(date) over (partition by foreign_key_id order by date) as next_date
            from t
           ) t
      where next_date <> date + interval '1 day';
      

      这将提供下一行没有预期日期的每一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        相关资源
        最近更新 更多