Get created as well as deleted entries of last week

后端 未结 2 517
星月不相逢
星月不相逢 2021-01-27 07:26

With this query I can get all entries created during the last week:

SELECT day, COALESCE(ct, 0) AS ct
FROM  (SELECT now::date - d AS day FROM generate_series (0,         


        
相关标签:
2条回答
  • 2021-01-27 08:05

    Since both timestamps can exist 0 - n times in the time frame and independent from each other, you have to do more:

    Requires Postgres 9.3+:

    WITH var(ts_min) AS (SELECT date_trunc('day', now()) - interval '6 days')
    SELECT day
         , COALESCE(c.created, 0) AS created
         , COALESCE(d.deleted, 0) AS deleted
    FROM   var v
    CROSS  JOIN LATERAL (
       SELECT d::date AS day
       FROM   generate_series (v.ts_min
                             , v.ts_min + interval '6 days'
                             , interval '1 day') d
       ) t
    LEFT   JOIN (
       SELECT created_at::date AS day, count(*) AS created
       FROM   entries
       WHERE  created_at >= (SELECT ts_min FROM var)
       GROUP  BY 1
       ) c USING (day)
    LEFT   JOIN (
       SELECT canceled_at::date AS day, count(*) AS deleted
       FROM   entries
       WHERE  canceled_at >= (SELECT ts_min FROM var)
       GROUP  BY 1
       ) d USING (day)
    ORDER  BY 1;
    

    The CTE var is only for the convenience to provide the starting timestamp once.

    SQL Fiddle.

    0 讨论(0)
  • 2021-01-27 08:29

    At first glance it looks like your performing a count function rather than a sum which is what you need, your simply just counting each record twice.

    sum( CASE WHEN (created_at >= date_trunc('day', now()) - interval '6d') 
           THEN 1 ELSE 0 END) AS ct,
    sum(CASE WHEN (canceled_at >= date_trunc('day', now()) - interval '6d') 
           THEN 1 ELSE 0 END) AS dl  
    

    You need to use sum which will then add all the cases where you case when is returning 1 rather than count which just counts all the values regardless whether they are 1 or 0!

    0 讨论(0)
提交回复
热议问题