UPDATE logs SET message = REGEXP_REPLACE(message, '\s+', ' ', 'g');
使用正则表达式替换多余空格为单个空格
数据类型转换
ALTER TABLE employees ALTER COLUMN salary TYPE NUMERIC USING salary::numeric;
显式转换字段类型(如VARCHAR转NUMERIC)
去重(保留最新)
DELETE FROM orders o1 WHERE EXISTS (SELECT 1 FROM orders o2 WHERE o1.id = o2.id AND o1.create_time < o2.create_time);
删除重复数据,保留最新记录
二、数据聚合与分析模板
场景
SQL脚本示例
说明
分组统计
SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;
按部门统计员工数量
滚动平均值
SELECT order_time, AVG(amount) OVER (ORDER BY order_time ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS rolling_avg FROM sales;
计算近3条记录的滚动平均值
同比增长率
WITH monthly_sales AS (SELECT DATE_TRUNC('month', order_time) AS month, SUM(amount) AS total FROM sales GROUP BY month) SELECT month, total, LAG(total) OVER (ORDER BY month) AS prev_total, (total - LAG(total) OVER (ORDER BY month)) / LAG(total) OVER (ORDER BY month) * 100 AS growth_rate FROM monthly_sales;
计算月度销售额同比增长率
Top N分析
SELECT product_id, SUM(quantity) AS total_sold FROM sales GROUP BY product_id ORDER BY total_sold DESC LIMIT 10;
统计销量前10的产品
三、窗口函数应用模板
场景
SQL脚本示例
说明
行号分配
SELECT order_id, ROW_NUMBER() OVER (ORDER BY order_time) AS row_num FROM orders;
为结果集分配唯一行号
累计求和
SELECT order_time, amount, SUM(amount) OVER (ORDER BY order_time) AS cumulative_sum FROM sales;
计算累计销售额
排名分析
SELECT product_id, RANK() OVER (ORDER BY total_sold DESC) AS rank FROM (SELECT product_id, SUM(quantity) AS total_sold FROM sales GROUP BY product_id) AS sub;
按销量对产品进行排名
前后行对比
SELECT order_time, amount, LAG(amount) OVER (ORDER BY order_time) AS prev_amount FROM sales;
访问前一行的销售额
四、性能优化与监控模板
场景
SQL脚本示例
说明
查询执行计划
EXPLAIN ANALYZE SELECT * FROM employees WHERE department = 'Engineering';
分析查询执行计划,定位性能瓶颈
索引分析
SELECT relname AS index_name, reltuples AS cardinality FROM pg_class WHERE relkind = 'i' AND relname NOT LIKE 'pg_%' ORDER BY reltuples DESC;
查询索引基数,评估索引效率
慢查询监控
SELECT query, total_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;
CREATE ROLE analyst LOGIN PASSWORD 'secure_password';
创建具有登录权限的用户
分配权限
GRANT SELECT, INSERT ON employees TO analyst;
授予用户表查询和插入权限
回收权限
REVOKE SELECT ON employees FROM analyst;
回收用户表查询权限
审计用户行为
ALTER SYSTEM SET log_statement = 'all'; ALTER SYSTEM SET log_line_prefix = '%m [%p] user=%u database=%d ';
配置日志记录用户操作(需重启数据库)
七、事务与错误处理模板
场景
SQL脚本示例
说明
事务提交与回滚
BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;
原子性转账操作
错误自动回滚
BEGIN; INSERT INTO employees (id, name) VALUES (1, 'Alice'); INSERT INTO employees (id, name) VALUES (1, 'Bob'); -- 主键冲突 COMMIT;
若执行过程中出错,事务自动回滚
异常捕获
DO $$ BEGIN INSERT INTO employees (id, name) VALUES (1, 'Alice'); EXCEPTION WHEN unique_violation THEN RAISE NOTICE 'Duplicate key error'; END $$;
使用DO块捕获唯一约束冲突异常
八、时间序列分析模板
场景
SQL脚本示例
说明
时间窗口聚合
SELECT DATE_TRUNC('hour', order_time) AS hour, SUM(amount) AS total_sales FROM sales WHERE order_time BETWEEN '2024-01-01' AND '2024-01-02' GROUP BY hour ORDER BY hour;
按小时统计销售额
实时流量监控
SELECT DATE_TRUNC('minute', order_time) AS minute, COUNT(*) AS order_count FROM sales WHERE order_time >= NOW() - INTERVAL '1 hour' GROUP BY minute ORDER BY minute;
统计最近1小时每分钟的订单量
时间序列补全
WITH RECURSIVE time_series AS (SELECT '2024-01-01'::DATE AS date UNION ALL SELECT date + INTERVAL '1 day' FROM time_series WHERE date < '2024-01-31') SELECT ts.date, COALESCE(s.total_sales, 0) AS total_sales FROM time_series ts LEFT JOIN (SELECT DATE_TRUNC('day', order_time) AS date, SUM(amount) AS total_sales FROM sales GROUP BY date) s ON ts.date = s.date ORDER BY ts.date;
补全缺失日期的销售数据
九、日志分析与诊断模板
场景
SQL脚本示例
说明
慢查询日志过滤
SELECT query, total_time FROM pg_stat_statements WHERE total_time > INTERVAL '1 second' ORDER BY total_time DESC;
筛选执行时间超过1秒的查询
死锁检测
SELECT * FROM pg_stat_activity WHERE query LIKE '%UPDATE%' AND state = 'idle in transaction';