最近使用PostgreSQL做了不少数据处理的工作,现将用到的SQL语句整理一下。
创建数据库
CREATE DATABASE table_name;
创建表格
CREATE table_name IF NOT EXISTS {} (time timestamp, data int)
插入数据
insert into table_name values(%s, %s);
选择数据
SELECT time, data FROM table_name
多表上下不去重关联
SELECT * FROM table1 UNION ALL SELECT * FROM table2
UNION是上下关联,将多个表的数据进行合并,分为去重合并UNION和不去重合并UNION ALL
多表左右关联并筛选
SELECT time, data FROM table1 JOIN table2 ON table1.id=table2.id WHERE table1.code in (‘999’)
join 是左右关联,相关的还有left right full 等, on是join的规则
where是条件语句
转换列的类型
alter TABLE table_name alter COLUMN col_name type int using col_name::int
将表格table_name中的col_name列的类型转换为int
NULL填充为0
update table_name set col_name=coalesce(col_name, 0)
将表格table_name 中的col_name列中的NULL填充为0
时间等距离分割
SELECT date_trunc(‘hour’, time) + INTERVAL ‘2 minutes’ * (floor(extract(‘minute’ from time) / 2)) AS time_slot,sum(data) FROM table_name GROUP BY time_slot ORDER BY time_slot;
将表格table_name根据时间time列按照每2分钟间隔进行分组求和并按照时间排序
时间修改格式
to_char(time, ‘YYYY-MM-DD HH24:MI:00’)::TIMESTAMP
后面的::TIMESTAMP可有可无,根据多种时间数据的统一格式来
创建一个时间戳(序列)
在多表融合中,通常需要考虑数据缺失的情况,因此我们应当手动设置标准的时间列,这样缺失的数据行也会显示,不会因为数据缺失而不显示。
SELECT ‘2023-06-09 08:00:00’::timestamp AS time
SELECT generate_series(‘2023-01-01 08:00’::timestamp, ‘2023-01-01 21:00’::timestamp, ‘10 minutes’::interval) AS timestamp;