获取每篇文章每天最后条目的总和
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
只需添加每天/文章的第一篇。
查看
假设有一个 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
只需添加每天/文章的第一篇。
查看