2015-10-07 51 views
3
user timespent(in sec) date(in timestamp) 
u1  10    t1(2015-08-15) 
u1  20    t2(2015-08-19) 
u1  15    t3(2015-08-28) 
u1  16    t4(2015-09-06) 

以上是我的表的格式,它表示用戶在課程中超時並且按時間戳排序。我想通過一個特定的用戶得到timespent的總和,說U1每週格式:從postgres每週(根據日期)獲取數據

start_date end_date  sum 
2015-08-15 2015-08-21  30 
2015-08-22 2015-08-28  15 
2015-08-29 2015-09-04  0 
2015-09-05 2015-09-11  16 
+0

你通過'T1的意思(2015-08 -15)'(爲什麼** t1 **在這裏)'日期列'中的值? –

+0

我編輯了它...是啊t1可以是任何時間戳(我已經寫在括號中的示例) – Jayant

+0

t1可以是任何時間戳.... 2015-08-15是一個例子...請原諒我沒有正確澄清它 – Jayant

回答

1

困難在於,您想要獲得的七天週期不是週一開始的常規周。 因此,您不能使用標準函數來獲取基於日期的星期編號,並且必須使用您自己的星期生成器使用generate_series()

實施例的數據:

create table sessions (user_name text, time_spent int, session_date timestamp); 
insert into sessions values 
('u1', 10, '2015-08-15'), 
('u1', 20, '2015-08-19'), 
('u1', 15, '2015-08-28'), 
('u1', 16, '2015-09-06'); 

查詢針對任意選擇的期間從2015年8月15日到2015年9月6日:

with weeks as (
    select d::date start_date, d::date+ 6 end_date 
    from generate_series('2015-08-15', '2015-09-06', '7d'::interval) d 
    ) 
select w.start_date, w.end_date, coalesce(sum(time_spent), 0) total 
from weeks w 
left join (
    select start_date, end_date, coalesce(time_spent, 0) time_spent 
    from weeks 
    join sessions 
    on session_date between start_date and end_date 
    where user_name = 'u1' 
    ) s 
on w.start_date = s.start_date and w.end_date = s.end_date 
group by 1, 2 
order by 1; 

start_date | end_date | total 
------------+------------+------- 
2015-08-15 | 2015-08-21 | 30 
2015-08-22 | 2015-08-28 | 15 
2015-08-29 | 2015-09-04 |  0 
2015-09-05 | 2015-09-11 | 16 
(4 rows) 
+0

謝謝Klin ...這是工作:) – Jayant

0

像這樣的東西(假設通過時間戳你指的是數據類型timestamp)。 爲了讓星期的第一天成爲星期日,我在group by中增加了額外的一天來「約會」。

select (start_date - date_part('dow', start_date) * interval '1 day')::date start_date, 
     (start_date + (6 - date_part('dow', start_date)) * interval '1 day')::date end_date, 
     total_time_spent 
from (
    select min("date") start_date, sum(timespent) total_time_spent 
    from mytable 
    where user=u1 
    group by date_part('year', "date"), date_part('week', "date" + interval '1 day')) "tmp" 

order by start_date 

這是一種更通用的方法,適用於任何日期間隔。

0
select 
    ui, 
    date_trunc('week', the_date)::date as start_date, 
    date_trunc('week', the_date)::date + 6 as end_date, 
    sum(timespent) as "sum" 
from t 
group by 1, 2, 3 
order by 1,2