【问题标题】:Generating series Postgres生成系列 Postgres
【发布时间】:2019-03-21 06:12:26
【问题描述】:

我希望能够按天、周、月或根据我设置的间隔生成行组

按照这个solution,它在粒度为月时有效。但是尝试 1 周的间隔,没有返回任何记录。

这是我桌子上的行

这是我每月间隔的当前查询,效果很好。

SELECT *
FROM  (
   SELECT  day::date
   FROM   generate_series(timestamp '2018-09-01'
                        , timestamp '2018-12-01'
                        , interval  '1 month') day
   ) d
LEFT   JOIN (
   SELECT date_trunc('month', created_date)::date AS day
        , SUM(escrow_amount) AS profit, sum(total_amount) as revenue
   FROM   (
   select distinct on (order_id) order_id, escrow_amount, total_amount, create_time from order_item
   WHERE  created_date >= date '2018-09-01'
   AND    created_date <= date '2018-12-01'
-- AND    ... more conditions

   ) t2 GROUP  BY 1
   ) t USING (day)
ORDER  BY day;

此查询的结果

这是每周间隔查询。为简洁起见,我会将范围缩小到两个月。

SELECT *
FROM  (
   SELECT  day::date
   FROM   generate_series(timestamp '2018-09-01'
                        , timestamp '2018-11-01'
                        , interval  '1 week') day
   ) d
LEFT   JOIN (
   SELECT date_trunc('week', created_date)::date AS day
        , SUM(escrow_amount) AS profit, sum(total_amount) as revenue
   FROM   (
   select distinct on (order_id) order_id, escrow_amount, total_amount, create_time from order_item
   WHERE  created_date >= date '2018-09-01'
   AND    created_date <= date '2018-11-01'
-- AND    ... more conditions

   ) t2 GROUP  BY 1
   ) t USING (day)
ORDER  BY day;

请注意,我有 10 月的记录,但此处的结果没有显示 10 月日期的任何内容。

知道我在这里缺少什么吗?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您的第一个查询的结果不会被截断到一周的开始。

    date_trunc('2018-09-01'::date, 'week')::date
    

    等于

    '2018-08-27'::date
    

    所以你的加入使用日不起作用

    '2018-09-01'::date <> '2018-08-27'::date
    

    您的查询应该看起来更像这样:

    SELECT *
    FROM  (
       SELECT  day::date
       FROM   generate_series(date_trunc('week',timestamp '2018-09-01') --series begin trunc
                            , timestamp '2018-11-01'
                            , interval  '1 week') day
       ) d
    LEFT   JOIN (
       SELECT date_trunc('week', created_date::date)::date AS day
            , SUM(escrow_amount) AS profit, sum(total_amount) as revenue
       FROM   (
       select distinct on (order_id) order_id, escrow_amount, total_amount, create_time from order_item
       WHERE  created_date::date >= date '2018-09-01'
       AND    created_date::date <= date '2018-11-01'
    -- AND    ... more conditions
    
       ) t2 GROUP  BY 1
       ) t USING (day)
    WHERE day >= '2018-09-01' --to skip days from begining of the week to the begining of the series before trunc
    ORDER  BY day;
    

    【讨论】:

    • 对不起,修改了代码。它应该只是 created_date 没有 ::date
    • 我附上了代码示例。你应该在你的系列中整理日期,以便它们与周开始相匹配。 2018-09-01 不是一周的开始,因此您的系列与汇总的日期不匹配
    • 我明白了!让我试试看!
    • 呼呼你救了我一天!有用! @Grzegorz Sancewicz
    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多