获取上周创建和删除的条目
Get created as well as deleted entries of last week
通过这个查询,我可以获得上周创建的所有条目:
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);
它 returns 这样的结果:
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_at
:我试过的是:
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 的情况,而不是 count ,它只计算所有值,无论它们是 1 还是 0!
由于两个时间戳都可以在时间范围内存在0-n次并且彼此独立,所以你必须做更多的事情:
需要 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;
CTEvar
只是为了方便提供一次起始时间戳。
通过这个查询,我可以获得上周创建的所有条目:
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);
它 returns 这样的结果:
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_at
:我试过的是:
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 的情况,而不是 count ,它只计算所有值,无论它们是 1 还是 0!
由于两个时间戳都可以在时间范围内存在0-n次并且彼此独立,所以你必须做更多的事情:
需要 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;
CTEvar
只是为了方便提供一次起始时间戳。