[英]How to calculate rolling timestamp sum from table partitioned by specific column? - SQL
[英]Calculate rolling year totals in sql
我正在收集的東西本質上是用戶的“注冊日期”。 “入學日期”並沒有存儲在數據庫中(原因太長在這里解釋),所以我必須從數據中推斷出來。 然后,我想在另一個查詢中的許多地方重用此 CTE,以收集諸如“注冊前 1 年的總訂單”和“注冊后 1 年的總訂單”之類的值。
我還沒有運行這段代碼,因為它在我的實際數據集中要復雜得多(這段代碼是從實際代碼中轉述的),我覺得這不是最好的方法。 正如你所看到的,我的日期條件大多只是占位符,但我認為我想要做什么應該很明顯。
也就是說,我認為這主要是可行的。 我的問題是,有沒有更好的方法來做到這一點? 另外,我可以以某種方式將之前的滾動年份和之后的滾動年份合並到一張表中嗎? (也許 window 功能)? 這是一個更大的查詢的一部分,所以我可以做的合並越多,它看起來就越好。
值得一提的是,派生“注冊日期”的子查詢也比此處顯示的更復雜。
With enroll as (Select
user_id,
MIN(date) as e_date
FROM `orders` o
WHERE (subscribed = True)
group by user_id
)
Select*
from users
left join (select
user_id,
SUM(total_paid)
from orders where date > (select enroll.e_date where user_id = user_id) AND date < (select enroll.e_date where user_id = user_id + 365 days)
and order_type = 'special'
group by user_id
) as rolling_year_after on rolling_year_after.user_id = users.user_id
left join (select
user_id,
SUM(total_paid)
from orders where date < (select enroll.e_date where user_id = user_id) and date > (select enroll.e_date where user_id = user_id - 365 days)
and order_type = 'special'
group by user_id
) as rolling_year_before on rolling_year_before.user_id = users.user_id
也許是這樣的,不確定它是否更高效,但看起來更干凈:
With enroll as (Select
user_id,
MIN(date) as e_date
FROM `orders` o
WHERE (subscribed = True)
group by user_id
)
, rolling_year as (
select
user_id,
SUM(CASE WHEN date between enroll.edate and enroll.edate + 365 days then (total_paid) else 0 end) as rolling_year_after,
SUM(CASE WHEN date between enroll.edate - 365 days and enroll.edate then (total_paid) else 0 end) as rolling_year_before
from orders
left join enroll
on order.user_id = enroll.user_id
where order_type = 'special'
group by user_id
)
Select *
from users
left join rolling_year
on users.user_id = rolling_year.user_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.