我有一个小表(TABLEA
),其中有两列IDA
和DATETIMEA
。
TABLEA
IDA DATETIMEA
1 2020-03-16 13:15:00
2 2020-03-17 15:25:00
3 2020-03-18 17:10:00
5 2020-03-19 11:44:00
5 2020-03-20 12:55:00
5 2020-03-21 19:35:00
7 2020-03-22 10:13:00
8 2020-03-22 15:25:00
8 2020-03-28 12:12:00
9 2020-03-29 17:55:00
10 2020-03-30 11:54:00
12 2020-03-30 15:35:00
12 2020-03-31 13:19:00
我正在尝试获取每天IDA
的总数,最近7天的总数以及最近30天的总数。
预期产量
DATE DAY L7 L30
2020-03-16 1 1 1
2020-03-17 1 2 2
2020-03-18 1 3 3
2020-03-19 1 4 4
2020-03-20 1 5 5
2020-03-21 1 6 6
2020-03-22 2 8 8
2020-03-28 1 3 9
2020-03-29 1 4 10
2020-03-30 2 6 12
2020-03-31 1 7 13
我尝试将与日期相关的输出放入子查询中,但它们返回0。
SELECT t.DATETIMEA::date date,
COUNT(t.*) "day",
(SELECT COUNT(w.*) FROM TABLEA w WHERE w.DATETIMEA::date BETWEEN w.DATETIMEA::date AND w.DATETIMEA::date - 7) week,
(SELECT COUNT(m.*) FROM TABLEA m WHERE m.DATETIMEA::date BETWEEN m.DATETIMEA::date AND m.DATETIMEA::date - 30) "month"
FROM TABLEA t
GROUP BY t.DATETIMEA::date
ORDER BY t.DATETIMEA::date
答案 0 :(得分:3)
如果您的数据在几天内可能会出现间隔,则您需要一个range
框架规范而不是一个rows
框架。很高兴Postgres支持此规范,因此您可以执行以下操作:
select
datetimea::date date,
count(*) "day",
sum(count(*)) over(
order by datetimea::date
range between '7 day' preceding and current row
) l7,
sum(count(*)) over(
order by datetimea::date
range between '30 day' preceding and current row
) l30
from mytable
group by datetimea::date
order by datetimea::date
date | day | l7 | l30 :--------- | --: | -: | --: 2020-03-16 | 1 | 1 | 1 2020-03-17 | 1 | 2 | 2 2020-03-18 | 1 | 3 | 3 2020-03-19 | 1 | 4 | 4 2020-03-20 | 1 | 5 | 5 2020-03-21 | 1 | 6 | 6 2020-03-22 | 2 | 8 | 8 2020-03-28 | 1 | 4 | 9 2020-03-29 | 1 | 4 | 10 2020-03-30 | 2 | 4 | 12 2020-03-31 | 1 | 5 | 13
答案 1 :(得分:2)
我认为窗口函数可以满足您的要求:
select t.datetimea::date, count(*) as on_day,
sum(count(*)) over (order by t.datetimea::date rows between 6 preceding and current row) as sum_7,
sum(count(*)) over (order by t.datetimea::date rows between 29 preceding and current row) as sum_30
from tablea t
group by t.datetimea::date;
在“过去7天”中,我假设您的意思是今天和之前的6天。如果您指的是今天的7天,则可以轻松调整窗框。