假设有一个结构如下的表:
ID | article_id | article_count | created_at
---|------------------------------------------
1 | 1 | 10 | 2019-03-20T18:20:03.685059Z
2 | 1 | 22 | 2019-03-20T19:20:03.685059Z
3 | 2 | 32 | 2019-03-20T18:20:03.685059Z
4 | 2 | 20 | 2019-03-20T19:20:03.685059Z
5 | 1 | 3 | 2019-03-21T18:20:03.685059Z
6 | 1 | 15 | 2019-03-21T19:20:03.685059Z
7 | 2 | 3 | 2019-03-21T18:20:03.685059Z
8 | 2 | 30 | 2019-03-21T19:20:03.685059Z
现在的目标是每天对所有article_count
中的所有article_ids
进行汇总,以得出最后一个条目,并每天返还该总数。因此,在上述情况下,我想显示一个结果:
total | date
--------|------------
42 | 2019-03-20
45 | 2019-03-21
到目前为止,我尝试过类似的操作:
SELECT SUM(article_count), DATE_TRUNC('day', created_at)
FROM myTable
WHERE created_at IN
(
SELECT DISTINCT ON (a.created_at::date, article_id::int) created_at
FROM myTable a
ORDER BY created_at::date DESC, article_id, created_at DESC
)
GROUP BY DATE_TRUNC('day', created_at)
在不同的查询中,我尝试每天仅提取article_id
的最新条目,然后匹配created_at
以求和所有article_count
的值。
这是行不通的-它仍然会输出一整天的总和,而不是最后一次输入的总和。
除此以外,我很确定还有比where条件更优雅的方法。
预先感谢(以及任何解释)。
答案 0 :(得分:2)
我认为您只想过滤每篇文章每天的最后一个条目:
SELECT DATE_TRUNC('day', created_at), SUM(article_count)
FROM (SELECT DISTINCT ON (a.created_at::date, article_id::int) a.*
FROM myTable a
ORDER BY article_id, created_at::date DESC, created_at DESC
) a
GROUP BY DATE_TRUNC('day', created_at);
答案 1 :(得分:1)
您正在寻找排名函数:
WITH cte
AS (SELECT article_id,
article_count,
Date_trunc('day', created_at) AS some_date,
Row_number ()
OVER (
partition BY article_id, Date_trunc( 'day', created_at)
ORDER BY created_at DESC ) AS n
FROM mytable)
SELECT Sum(article_count) AS total,
some_date
FROM cte
WHERE n = 1
GROUP BY some_date
只需添加每天/文章的第一天即可。
进行检查