sql - postgreSQL 选择昨天的值,月平均值

标签 sql postgresql

我有一个 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 数据类型 datetimestampinterval 进行适当的日期/时间工作。

第一部分是窗口函数的简单应用;只是 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;

如图:http://sqlfiddle.com/#!15/c953f/1

关于sql - postgreSQL 选择昨天的值,月平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776763/

相关文章:

postgresql - 如何限制Postgresql jdbc池连接数?

postgresql - pg_stat_activity 中的查询被截断了吗?

SQL SELECT ... WHERE IN 带有单独的 LIMIT,OFFSET 子句

Postgresql - 如何在常量下获取列中的最大值

php - 如何使用 PHP 从具有多个同名列的 MySQL 行中获取结果?

MySQL View 无法从 MS Access 编辑

mysql - 如何在mysql中加载数据输入文件,第一个列是自动增量?

mysql - 存储过程无法识别参数。我的代码有什么问题?

MYSQL/JSON : compare an array with the list of a column in JSON format and count the number of terms that match

java - 在 Hibernate 4 和 Postgres 中使用 "SELECT FOR UPDATE OF"