我正在使用的表称为"事务"。这些列是 id(客户 ID)、金额(客户花费的金额)、时间戳(购买时间)。
我正在尝试查询:
- 昨日收入:金额总和。
- 从 8 天前的收入到昨天的收入的百分比差异。
- 美特达。
- 从上个月MTD到本月MTD的百分比差异。
示例数据
id | 金额 | 时间戳 |
---|---|---|
1 | 50 | 2021-12-01 |
2 | 60 | 2021-12-02 |
3 | 70 | 2021-11-05 |
4 | 80 | 2022-01-26 |
5 | 90 | 2022-01-25 |
6 | 20 | 2022-01-26 |
7 | 80 | 2022-01-19 |
需要考虑的一些事项:
- "昨天与上周"目前在开头使用
timestamp::date > current_date - 1
。这将仅包括今天的交易,而不是昨天的交易(它说"大于昨天")。我认为应该是timestamp::date = current_date - 1
- 我在这里可能是错的,但我认为如果当前日期与昨天在同一个月,
sum(case when date_trunc('month',timestamp) = date_trunc('month',CURRENT_DATE -1)
也会捕获当前日期的交易。你可能不想这样。
据 - 我所知,"pct_change_month_prior"应该是
1.45
,而不是0.5
。您在 12 月有110
,在 1 月有270
。270 - 110 = 160
和160 / 110 = 1.45
.现有查询已返回该结果。FWIW,您也可以使用new/old-1
以稍微简单的方式获得相同的结果。
好的,所以真的,这是关于你陈述SELECT
部分的数学。
更改金额为:new - old
作为乘法量,它是(new - old) / old
或new / old - 1
作为百分比,您需要乘以 100...100 * (new / old - 1)
但我知道你并不担心这个。
此外,让我们确保您的新旧正确。
昨天的总和:
sum(case when timestamp::date = CURRENT_DATE - 1 then amount else null end)
8天前 总和:
sum(case when timestamp::date = CURRENT_DATE - 8 then amount else null end)
1个月到昨天的总和:
sum(case when timestamp::date > CURRENT_DATE - 1 - INTERVAL '1 month' AND timestamp::date <= CURRENT_DATE - 1 then amount else null end)
1个月至1个月零1天前的总和:
sum(case when timestamp::date > CURRENT_DATE - 1 - INTERVAL '2 month' AND timestamp::date <= CURRENT_DATE - 1 - INTERVAL '1 month' then amount else null end)
月初到昨天的总和:
sum(case when timestamp::date > DATE_TRUNC('month', CURRENT_DATE - 1) AND timestamp::date <= CURRENT_DATE - 1 then amount else null end)
从昨天的上个月开始到一个月前的昨天总和:
sum(case when timestamp::date > DATE_TRUNC('month', CURRENT_DATE - 1 - INTERVAL '1 month') AND timestamp::date <= CURRENT_DATE - 1 - INTERVAL '1 month' then amount else null end)
重要的是,不要将=
更改为>
或仅裁剪为日期部分,否则您将包含比您真正想要的更多的内容。
实际上,通过裁剪到月份部分,它几乎总是将两个月的所有交易相加。