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

Get sum over last entries per day per article

假设有一个 table 结构如下:

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_ids 中的所有 article_count 求和,并返回每天的总计数。所以在上面的例子中,我想得到一个结果显示:

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)

在 distinct 查询中,我尝试每天仅提取每个 article_id 的最新条目,然后匹配 created_at 以总结所有 article_count 值。 这不起作用 - 它仍然输出一整天的总和,而不是最后一个条目的总和。

除此之外,我很确定可能有比 where 条件更优雅的方法。

提前致谢(以及任何解释)。

我想您只想过滤到每篇文章每天的最后一篇文章:

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);

您正在寻找排名函数:

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

查看