postgresql - Postgres如何从关系表组中获取上个月的总和?
问题描述
我有两张桌子
coins summary_coins
-------- -------------
id | name id| date | get_count | coin_id
===|==== ==============================================
1 |lira 1 | 2020-02-16 16:55:50 | 20 | 1
2 |A 1 | 2020-03-16 16:55:50 | 12 | 1
3 |B 1 | 2020-03-16 16:55:50 | 20 | 1
我的预期结果
name get_count previous_month_count
Lira 32 20
通过以下查询,我可以获得当前月份的汇总总和
SELECT Coins.id AS "Coins__id",
Coins.name AS "Coins__name",
(SUM(SummaryCoins.get_count)) AS "get_count",
(SUM(SummaryCoins.get_count)) AS "previous_month_count"
FROM coins Coins
INNER JOIN summary_coins SummaryCoins
ON Coins.id = (SummaryCoins.coin_id)
WHERE (SummaryCoins.user_id = 1 AND SummaryCoins.date > '2021-04-01' AND SummaryCoins.date < '2021-05-31')
GROUP BY Coins.id
我怎样才能得到上个月的总和?
解决方案
一种方法是扩展 WHERE 子句中的日期范围以包括两个月(或实际上是所有三个月),然后在 SELECT 列表中使用过滤聚合。
SELECT c.id AS "Coins__id",
c.name AS "Coins__name",
SUM(sc.get_count) filter (where sc.date >= '2021-03-01' and sc.date < '2021-04-01') AS get_count,
SUM(sc.get_count) filter (where sc.date >= '2021-04-01' and sc.date < '2021-05-01') AS previous_month_count
FROM coins c
JOIN summary_coins sc ON c.id = sc.coin_id
WHERE sc.date >= '2021-03-01' --<< note this includes the "previous" month
AND sc.date < '2020-05-01'
GROUP BY c.id
在处理时间戳值(尽管列名“日期”具有误导性)时,建议使用运算符在所需范围结束后<
的一天使用,以确保包含最后一天的所有值。
推荐阅读
- css - 不同的选择器,相同的样式,如何防止less中的重复输出
- node.js - 从 nodejs 服务在 redis-cache 中缓存 JSON 的最佳方法是什么?
- javascript - 文本较大时如何将文本移动到同一行的新行
- javascript - 如何获得现在和下周五之间的小时差
- testing - 如何将设备添加到 Botium Box 中的设备集
- c# - 自动快速启动不编译
- svn - svn合并失败:连接被远程主机强行关闭
- prolog - Prolog中的变量是如何传递的?
- git - 我可以从使用 git show 创建的文件中应用整个提交吗?
- spring - 从 KeyCloak 重定向后如何获取 https 链接