我有一个 PostgreSQL 表:
create table UV(
f_date int,
uv bigint
)
数据:
f_date | uv
---------+-------
20150103 | 620964
20150104 | 595367
那么如何使用sql生成这样的表:
f_date | uv_today | uv_yesterday | uv_month_avg
---------+------------+--------------+--------------
20150103 | 620964 |(uv of 20150102)| average uv from 20141204 to 20150103
20150104 | 595367 | 620964 |
最佳答案
首先:不要将日期存储为整数!如果你想要约会,请使用 date
!尤其不要将日期存储为具有用于表示年、月和日的位值的整数。严重地。在继续实际使用它之前,您需要修复此模式。要么将纪元值存储为儒略日期,要么使用 native 数据类型 date
、timestamp
和 interval
进行适当的日期/时间工作。
第一部分是窗口函数的简单应用;只是 lag(uv, 1) OVER (ORDER BY f_date)
。
第二个有点棘手,但一旦您修复了架构,它就不会太糟糕。您可以使用 avg(uv) OVER (PARTITION BY date_trunc('month', f_date))
,假设您想要一个日历月。如果您想要 30 天的间隔,那就另当别论了。
所以像这样:
create table UV(
f_date date,
uv bigint
);
insert into UV (f_date, uv)
VALUES ('20150103', '620964'),
('20150104', '595367');
SELECT
f_date,
uv,
lag(uv, 1) OVER (ORDER BY f_date),
avg(uv) OVER (PARTITION BY date_trunc('month', f_date))
FROM UV;
关于sql - postgreSQL 选择昨天的值,月平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776763/