我正在使用的表稱為“事務”。列是 id(客戶 ID)、amount(客戶花費的金額)、timestamp(購買時間)。
我正在嘗試查詢:
- 昨天的收入:金額的總和。
- 8 天前收入與昨天收入的百分比差異。
- MTD。
- 從上個月 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 |
預期輸出
| 昨天_收入 | pct_change_week_ago | mtd | pct_change_month_prior |
|---|---|---|---|
| 100 | 0.25 | 270 | 0.50 |
這是我的代碼。百分比變化列都不正確。請幫忙。
select
-- yesterday
sum(case when timestamp::date = current_date - 1 then amount else null end) yesterday_revenue,
-- yesterday v. last week
(sum(case when timestamp::date > current_date - 1 then amount else null end) - sum(case when timestamp::date = current_date - 8 then amount else null end))
/ sum(case when timestamp::date = current_date - 8 then amount else null end) pct_change_week_ago,
-- mtd
sum(case when date_trunc('month',timestamp) = date_trunc('month',CURRENT_DATE -1) then amount else null end) mtd,
-- mtd v. month prior
(sum(case when date_trunc('month',timestamp) = date_trunc('month',CURRENT_DATE -1) then amount else null end) - sum(case when date_trunc('month',timestamp) = date_trunc('month',CURRENT_DATE -1) - interval '1 month'
and date_part('day',timestamp ) <= date_part('day', CURRENT_DATE -1) then amount else null end))
/ sum(case when date_trunc('month',timestamp) = date_trunc('month',CURRENT_DATE -1) - interval '1 month'
and date_part('day',timestamp ) <= date_part('day', CURRENT_DATE -1) then amount else null end) pct_change_month_prior
from transactions
uj5u.com熱心網友回復:
需要考慮的一些事項:
- “昨天與上周”目前
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。你有110十二月和270一月。270 - 110 = 160和160 / 110 = 1.45。您現有的查詢已經回傳該結果。FWIW,您還可以使用new/old-1更簡單的方式獲得相同的結果。
uj5u.com熱心網友回復:
好的,真的,這是關于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)
重要的是您不要更改=或>裁剪到日期部分,否則您將包含比您真正想要的更多的內容。
實際上,通過裁剪到月份部分,它幾乎總是將兩個月的所有交易相加。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422055.html
標籤:
下一篇:從另一個表中排除一個表中的字串
