Sql 创建和删除上周的条目

Sql 创建和删除上周的条目,sql,postgresql,aggregate-functions,Sql,Postgresql,Aggregate Functions,通过此查询,我可以获得上周创建的所有条目: SELECT day, COALESCE(ct, 0) AS ct FROM (SELECT now::date - d AS day FROM generate_series (0, 6) d) d -- 6, not 7 LEFT JOIN ( SELECT created_at::date AS day, count(*) AS ct FROM entries WHERE created_at &

通过此查询,我可以获得上周创建的所有条目:

SELECT day, COALESCE(ct, 0) AS ct
FROM  (SELECT now::date - d AS day FROM generate_series (0, 6) d) d  -- 6, not 7
  LEFT   JOIN (
     SELECT created_at::date AS day, count(*) AS ct 
     FROM   entries
     WHERE  created_at >= date_trunc('day', now()) - interval '6d'
     GROUP  BY 1
  ) e USING (day);
它返回如下结果:

 count | date
   2   |  15.01.2014
   0   |  14.01.2014
   1   |  13.01.2014
   0   |  12.01.2014
   0   |  11.01.2014
   0   |  10.01.2014
   9   |  09.01.2014
现在我还想显示上周删除的所有条目!我可以通过处的字段
deleted\u获取它们:我尝试的是:

SELECT day, COALESCE(ct, 0) AS created, COALESCE(dl,0) AS deleted
FROM  (SELECT current_date - d AS day FROM generate_series (0, 6) d) d  
LEFT   JOIN (
   SELECT created_at::date AS day, 
      count(
        CASE WHEN (created_at >= date_trunc('day', now()) - interval '6d') THEN 1 ELSE 0 END
      ) AS ct,
count(
    CASE WHEN (canceled_at >= date_trunc('day', now()) - interval '6d') THEN 1 ELSE 0 END
) AS dl  
  FROM   entries

   GROUP  BY 1
  ) e USING (day);
但那没用!现在我得到了两行相同的内容:

deleted | created | date
  2     |  2      |  15.01.2014
  0     |  0      |  14.01.2014
  1     |  1      |  13.01.2014
  0     |  0      |  12.01.2014
  0     |  0      |  11.01.2014
  0     |  0      |  10.01.2014
  9     |  9      |  09.01.2014

我错了什么?如何显示已创建和已删除的条目?

乍一看,您执行的是计数功能,而不是所需的总和,您只需对每条记录进行两次计数

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  

您需要使用sum,它将在case when返回1时添加所有case,而不是count,它只计算所有值,不管它们是1还是0

由于两个时间戳在时间范围内可以存在0-n次,并且彼此独立,因此您必须做更多的工作:

需要博士后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;
CTE
var
仅为方便提供一次启动时间戳


谢谢你的帮助!我真的不明白,所以你能添加一个正确的查询吗?谢谢请始终提供您的Postgres版本。这是对以下内容的后续操作:抱歉,我收到了
groupby 1
的语法错误,我真的不知道如何修复它!另外,我不确定这个查询是否会返回正确的结果,因为它在
created\u处创建了
left join
,而在
处也没有
cancelled\u!再次感谢你的帮助!如果你能解决这个问题,我会认为你的答案是正确的!谢谢@约翰斯米特:这些查询是错误的。我提供了一个全新的、经过测试的版本。