SQL Server技术问询:如何隐藏与前一行重复的后续invoice字段值?
实现SQL查询:重复Invoice值仅首次显示
原始数据表
| invoice | position |
|---|---|
| Cell 1 | Cell 1 |
| Cell 1 | Cell 2 |
| Cell 2 | Cell 3 |
| Cell 1 | Cell 4 |
期望查询结果
| invoice | position |
|---|---|
| Cell 1 | Cell 1 |
| Cell 2 | |
| Cell 4 | |
| Cell 2 | Cell 3 |
实现思路
核心逻辑是对相同的invoice值,仅在该值首次出现的行显示内容,后续同值行置为空,同时将同一invoice的所有position行集中排列。可以通过窗口函数标记分组内的行号,再根据行号判断是否显示invoice值。
具体SQL实现
通用版本(支持窗口函数的数据库:MySQL 8+/PostgreSQL/SQL Server等)
SELECT CASE WHEN row_num = 1 THEN invoice ELSE '' END AS invoice, position FROM ( SELECT invoice, position, ROW_NUMBER() OVER (PARTITION BY invoice ORDER BY position) AS row_num FROM your_table_name ) AS sub ORDER BY invoice, row_num;
说明
- 内层子查询用
PARTITION BY invoice按发票分组,ORDER BY position保证同发票下的位置按顺序排列,ROW_NUMBER()为每组内的行分配序号。 - 外层通过
CASE判断:分组第一行显示发票值,其余行显示空字符串。 - 最终排序确保同发票的行集中展示,顺序符合预期。
兼容旧版MySQL(无窗口函数)
如果使用MySQL 5.x及以下版本,可通过变量实现:
SELECT CASE WHEN @prev_invoice != invoice THEN invoice ELSE '' END AS invoice, position, @prev_invoice := invoice FROM your_table_name, (SELECT @prev_invoice := '') AS init ORDER BY invoice, position;
内容的提问来源于stack exchange,提问作者Bob Budowniczy
相关产品推荐
相关产品推荐

