【问题标题】:SQL comparing two date columns and keep the first row where 2nd column is largerSQL比较两个日期列并保留第二列较大的第一行
【发布时间】:2021-07-09 03:14:47
【问题描述】:

我有一个包含两个日期列 next_start_datecancel_date 的表格。

group_id individual_id cancel_date next_start_date_after_cancel
1 001 2017-11-06 2014-03-26
1 001 2017-11-06 2017-01-09
1 001 2017-11-06 2018-04-16
2 001 2018-06-04 2014-03-26
2 001 2018-06-04 2017-01-09
2 001 2018-06-04 2018-04-16
2 001 2018-08-28 2014-03-26
2 001 2018-08-28 2017-01-09
2 001 2018-08-28 2018-04-16

所需输出:days_customer_came_back 是计算列:

group_id individual_id cancel_date next_start_date_after_cancel days_customer_came_back
1 001 2017-11-06 2018-04-16 161
2 001 2018-06-04 null null
2 001 2018-08-28 null null

我的想法是我想比较cancel_datenext_start_date_after_cancel 这两列,next_start_date_after_cancel 必须在cancel_date 之后才能获得这些日期之间的正日差。

如果对于同一个cancel_date 有多个“next_start_date_after_cancel”,我们只保留第一个最小值,而忽略其他的。

另外,对于cancel_date的条目,如果所有可用的next_start_date_after_cancel都在cancel_date之前,我们会将其替换为null,并将日差输出为null

请帮忙...

【问题讨论】:

    标签: python sql postgresql


    【解决方案1】:

    使用FILTER 排除大于next_start_date_after_cancelcancel_date,在子查询或CTE 中获取它的min() 值。最后减去两个日期得到不同的天数:

    WITH j AS (
      SELECT 
        group_id,individual_id,cancel_date,
        min(next_start_date_after_cancel) FILTER (WHERE next_start_date_after_cancel > cancel_date) AS next_start_date_after_cancel
      FROM t GROUP BY 1,2,3)
    SELECT 
      group_id,individual_id,cancel_date,next_start_date_after_cancel,
      next_start_date_after_cancel-cancel_date
    FROM j;
    

    演示:db<>fiddle

    【讨论】:

    • 过滤器对我不起作用,但在将下一个开始日期与取消日期进行比较时,我尝试以不同的方式进行处理。谢谢你的想法
    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多