2016-02-16 69 views
1

我試圖寫一個高效的查詢得到的前7天的從關係數據庫表中的值的總和,並記錄對在7天週期的最後日期各總(中例如下面例子中的'WeeklyTotals Table')。舉例來說,在我的WeeklyTotals查詢,我想爲2月15日是333的價值,因爲這是用戶從2月9總和日 - 2月15日,等:總和SQL移位範圍查詢

Example of desired outcome

我有一個基本查詢它得到了我以前的周用戶對於今天的日期(簡化的例子的緣故):

SELECT Date, Sum("Total Users") 
FROM "UserRecords" 
WHERE (dateadd(hour, -8, "UserRecords"."Date") BETWEEN 
    dateadd(hour, -8, sysdate) - INTERVAL '7 DAY' AND dateadd(hour, -8, sysdate); 

的問題是,這只是讓我的總的今天的日期。我需要一個查詢,它可以在前七天爲我提供這些信息。

我知道我可以爲每個日期製作一個視圖(因爲我只需要前面的七個條目)並將它們連接在一起,但這看起來效率很低(我將不得不創建/更新7個視圖,然後執行所有內部連接操作)。我想知道是否有更高效的方法來實現這一點。

+0

添加您的數據庫中標記... –

+0

是否有日期串聯間隙? –

+0

紅移實現窗口函數嗎? –

回答

1

這裏有一個自我加入到以前的6天求和值來獲得每週總計查詢:

select u1.date, sum(u2.total_users) as weekly_users 
from UserRecords u1 
join UserRecords u2 
    on u1.date - u2.date < 7 
    and u1.date >= u2.date 
group by u1.date 
order by u1.date 
1

可以使用SUM了窗口功能,使用Date Partweek表達。

自連接比窗口函數慢得多。

1

提供不存在任何差距,你可以使用一個運行總計有SUM OVER包括六個以前行。使用ROW_NUMBER排除第一六個記錄,因爲他們的總數並不代表完整週。

select log_date, week_total 
from 
(
    select 
    log_date, 
    sum(total_users) over (order by log_date rows 6 preceding) as week_total, 
    row_number() over (order by log_date) as rn 
    from mytable 
    where log_date > 0 
) 
where rn >= 7 
order by log_date; 

UPDATE:如果有差距,應該是

sum(total_users) over (order by log_date range interval '6' day preceding) 

,但我不知道是否PostgreSQL的支持已經這樣。 (而且,ROW_NUMBER排除不會再工作,都必須由別的東西來代替。)