【问题标题】:PostgreSQL, summing multiple date columns over multiple rowsPostgreSQL,对多行的多个日期列求和
【发布时间】:2021-02-15 08:04:47
【问题描述】:

假设如下表:

CREATE TABLE assumption ( datetime_1 TIMESTAMP, datetime_2 TIMESTAMP, datetime_3 TIMESTAMP); 

现在我想知道在任何行或列组合中设置一个月的总次数,只要日期在未来。

现在我有:

  SELECT
    COALESCE(
      SUM(
          COALESCE(
               datetime_1 > NOW() AND EXTRACT(MONTH FROM datetime_1) = 1,
               FALSE
          )::INT,
          COALESCE(
               datetime_2 > NOW() AND EXTRACT(MONTH FROM datetime_2) = 1,
               FALSE
          )::INT,
          COALESCE(
               datetime_3 > NOW() AND EXTRACT(MONTH FROM datetime_3) = 1,
               FALSE
          )::INT
      ), 0) AS january_count,
      .... AS february_count,
      .... AS march_count,
      .... AS etc
    FROM assumption;

这可以正常工作并返回正确的结果,但它相当臃肿,并且每个月都会返回一行和一列。 在现实生活中,这个查询有点复杂,我宁愿得到一个每个月都会给我一行的结果(这样我就可以在每个月的行中添加更多字段)

我有什么遗漏的吗,有什么办法可以改进吗?

【问题讨论】:

    标签: sql postgresql datetime count unpivot


    【解决方案1】:

    您想要横向连接吗?

    select date_trunc('month', d.dt) dt_month, count(*) cnt
    from assumption a
    cross join lateral (values (datetime_1), (datetime_2), (datetime_3)) d(dt)
    where dt > now()
    group by date_trunc('month', d.dt)
    

    将日期截断到每月的第一天似乎比提取月份更有用(如果您的数据分布在未来几年,结果会有所不同)。但如果你的意思是提取月份,那么:

    select extract(month from d.dt) dt_month, count(*) cnt
    from assumption a
    cross join lateral (values (datetime_1), (datetime_2), (datetime_3)) d(dt)
    where dt > now()
    group by extract(month from d.dt)
    

    最后,如果你想要每个月有一行,即使是那些未来没有时间戳的,那么:

    select extract(month from d.dt) dt_month, count(*) filter(where d.dt > now()) cnt
    from assumption a
    cross join lateral (values (datetime_1), (datetime_2), (datetime_3)) d(dt)
    group by extract(month from d.dt)
    

    【讨论】:

    • 这太棒了!需要稍微摆弄一下,从不使用那些横向连接。一个充满机遇的新世界,tnx!
    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多