【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-C. 常用SQL脚本模板

发布于:2025-05-15 ⋅ 阅读:(16) ⋅ 点赞:(0)

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路



在这里插入图片描述
以下是《PostgreSQL数据分析实战:从数据清洗到可视化全流程》附录C的内容框架和核心知识点整理,结合官方文档与实战经验,采用 表格化速查形式呈现,适合技术书籍附录场景

附录C. 常用SQL脚本模板速查表

一、数据清洗与预处理模板
场景 SQL脚本示例 说明
去除字段首尾空格 UPDATE users SET username = TRIM(username); 使用TRIM()函数去除字符串首尾空格
处理空值填充 UPDATE sales SET amount = COALESCE(amount, 0); 使用COALESCE()NULL值替换为指定值(如0)
正则清洗 UPDATE logs SET message = REGEXP_REPLACE(message, '\s+', ' ', 'g'); 使用正则表达式替换多余空格为单个空格
数据类型转换 ALTER TABLE employees ALTER COLUMN salary TYPE NUMERIC USING salary::numeric; 显式转换字段类型(如VARCHARNUMERIC
去重(保留最新) 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; 查看耗时最长的10条查询(需启用pg_stat_statements扩展)
表空间管理 CREATE TABLESPACE fastspace LOCATION '/mnt/sda1/postgresql/data'; CREATE TABLE large_table (id INT) TABLESPACE fastspace; 创建表空间并指定表存储位置

在这里插入图片描述
在这里插入图片描述

五、数据备份与恢复模板
场景 SQL脚本示例 说明
全量备份 pg_dump -U postgres -Fc mydb > mydb_backup.backup 使用pg_dump进行逻辑备份
增量备份 pg_dump -U postgres -Fc --schema-only mydb > mydb_schema.backup 仅备份表结构
恢复备份 pg_restore -U postgres -d mydb mydb_backup.backup 从备份文件恢复数据库
表级备份 pg_dump -U postgres -t orders mydb > orders_backup.sql 备份单个表
六、权限管理与安全模板
场景 SQL脚本示例 说明
创建用户 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'; 查看可能导致死锁的事务
日志文件分析 pgbadger /var/log/postgresql/postgresql-16-main.log -o report.html 使用pgBadger生成可视化日志报告
十、高级功能模板
场景 SQL脚本示例 说明
JSON数据处理 SELECT id, data->>'name' AS name FROM json_table WHERE data->>'age' > '30'; 查询JSON字段中年龄大于30的记录
地理位置查询 SELECT id, ST_Distance(geom, ST_GeomFromText('POINT(120.123 30.456)')) AS distance FROM locations ORDER BY distance LIMIT 10; 查找距离指定点最近的10条记录(需启用postgis扩展)
全文搜索 SELECT id, title FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('data & analysis'); 搜索包含“data”和“analysis”的文章

附录使用说明

    1. 快速定位
    • 按场景分类查找模板,使用Ctrl+F搜索关键词(如“去重”“窗口函数”)。
    • 关键参数用{}标注,需根据实际环境替换(如{table_name})。
    1. 版本兼容性
    • 脚本适用于PostgreSQL 10+版本,部分功能(如pg_stat_statements)需手动安装扩展。
    • 表空间路径、日志文件位置等需根据实际部署调整。
    1. 安全建议
    • 生产环境执行脚本前,建议在测试环境验证。
    • 敏感操作(如DROP TABLE)需谨慎,优先使用事务控制。
    1. 扩展资源
    • 官方文档:PostgreSQL SQL Commands
    • 工具推荐:pgAdmin(图形化管理)、pgBadger(日志分析)、pgloader(数据迁移)

说明

  • 本附录包含PostgreSQL 16.2版本的主要脚本模板,实际应用中请结合具体环境验证。
  • 建议将本速查表作为日常开发和运维的参考工具,结合官方文档和日志分析工具进行综合应用。

网站公告

今日签到

点亮在社区的每一天
去签到