获取每篇文章每天最后条目的总和

时间:2019-03-22 19:55:02

标签: sql postgresql distinct

假设有一个结构如下的表:

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条件更优雅的方法。

预先感谢(以及任何解释)。

2 个答案:

答案 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 

只需添加每天/文章的第一天即可。

通过https://rextester.com/INODNS67085

进行检查