SQL实现保留var1/var2变更行及预估算表空间方法
一、原始表格(变量名已翻译为中文)
| 变量1 | 时间 | 变量2 |
|---|---|---|
| 值1 | 1 | a |
| 值1 | 2 | a |
| 值1 | 3 | a |
| 值1 | 4 | a |
| 值2 | 5 | a |
| 值1 | 6 | a |
| 值3 | 1 | b |
| 值4 | 2 | b |
| 值4 | 3 | b |
| 值5 | 4 | b |
二、期望结果表格
| 变量1 | 时间 | 变量2 |
|---|---|---|
| 值1 | 1 | a |
| 值2 | 5 | a |
| 值1 | 6 | a |
| 值3 | 1 | b |
| 值4 | 2 | b |
| 值5 | 4 | b |
三、移除重复行的实现方案
要过滤掉变量1和变量2连续重复的行,仅保留字段发生变化的记录,可以借助窗口函数对比当前行与上一行的字段值,以下是主流数据库的实现示例:
通用方案(支持多数据库)
WITH ranked_rows AS ( SELECT 变量1, 时间, 变量2, -- 获取上一行的变量1和变量2值 LAG(变量1) OVER (ORDER BY 时间) AS 上一行变量1, LAG(变量2) OVER (ORDER BY 时间) AS 上一行变量2 FROM 你的表名 ) SELECT 变量1, 时间, 变量2 FROM ranked_rows WHERE 上一行变量1 IS NULL -- 保留第一行数据 OR 变量1 != 上一行变量1 OR 变量2 != 上一行变量2;
按变量2分组优化方案
如果变量2是分组维度(比如示例中a、b为两个独立组),可以在窗口函数中加PARTITION BY,只对比同组内的变量1变化:
WITH ranked_rows AS ( SELECT 变量1, 时间, 变量2, LAG(变量1) OVER (PARTITION BY 变量2 ORDER BY 时间) AS 上一行变量1 FROM 你的表名 ) SELECT 变量1, 时间, 变量2 FROM ranked_rows WHERE 上一行变量1 IS NULL OR 变量1 != 上一行变量1;
四、执行查询前估算表占用空间的方法
不同数据库有原生工具可直接查看表的存储空间,无需执行数据修改操作:
MySQL/MariaDB
SELECT table_name, ROUND(data_length/1024/1024, 2) AS 数据大小_MB, ROUND(index_length/1024/1024, 2) AS 索引大小_MB, ROUND((data_length + index_length)/1024/1024, 2) AS 总大小_MB FROM information_schema.tables WHERE table_schema = '你的数据库名' AND table_name = '你的表名';
也可执行SHOW TABLE STATUS LIKE '你的表名';,查看Data_length和Index_length字段。
PostgreSQL
SELECT pg_size_pretty(pg_total_relation_size('你的表名')) AS 总大小, pg_size_pretty(pg_relation_size('你的表名')) AS 数据大小, pg_size_pretty(pg_indexes_size('你的表名')) AS 索引大小;
SQL Server
EXEC sp_spaceused '你的表名';
内容的提问来源于stack exchange,提问作者David Harar
相关产品推荐
相关产品推荐

