sql - 对 "super row"之后的行进行分组

标签 sql oracle grouping

我有这张表:

+-------------+-----------------------+----------------------+
| supplier_id | supplier_aggregate_id | supplier_description |
+-------------+-----------------------+----------------------+
| &&%%        | null                  | UNDEFINED            |
| ...         | &&%%                  | UNDEFINED            |
| +           | null                  | UNDEFINED            |
| ,           | &&%%                  | UNDEFINED            |
| .           | &&%%                  | UNDEFINED            |
+-------------+-----------------------+----------------------+

我想选择这样的结果:

+-------------+-----------------------+----------------------+
| supplier_id | supplier_aggregate_id | supplier_description |
+-------------+-----------------------+----------------------+
| &&%%        | null                  | UNDEFINED            |
| ,           | &&%%                  | UNDEFINED            |
| .           | &&%%                  | UNDEFINED            |
| ...         | &&%%                  | UNDEFINED            |
| +           | null                  | UNDEFINED            |
+-------------+-----------------------+----------------------+

即:具有 supplier_id 的行,后跟 supplier_aggregate_id 等于第一行 supplier_id 的所有行。

我尝试订购:

SELECT supplier_id, supplier_aggregate_id, supplier_description
FROM suppliers
ORDER BY supplier_id ASC, supplier_aggregate_id ASC;

但是我在第一个 &&%% 记录之后得到了 + 记录,这是不正确的:

+-------------+-----------------------+----------------------+
| supplier_id | supplier_aggregate_id | supplier_description |
+-------------+-----------------------+----------------------+
| &&%%        | null                  | UNDEFINED            |
| +           | null                  | UNDEFINED            | <-- this should be here
| ,           | &&%%                  | UNDEFINED            |                      |
| .           | &&%%                  | UNDEFINED            |                      |
| ...         | &&%%                  | UNDEFINED            |                      |
+-------------+-----------------------+----------------------+ <--------------------+

有没有办法通过单个查询来完成此任务?

SQLFiddle

最佳答案

最简单的事情是这样的:

select 
  s.supplier_id, 
  s.supplier_aggregate_id, 
  s.supplier_description 
from suppliers s
order by 
  COALESCE(s.supplier_aggregate_id, s.supplier_id) asc, 
  s.supplier_aggregate_id;

http://sqlfiddle.com/#!2/67cae/21

关于sql - 对 "super row"之后的行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25728326/

相关文章:

oracle - 在Oracle中,是否可以将以逗号分隔的非常大的字符串(clob)转换为具有更好性能的表

sql - 将日期与空值进行比较

sql - 将总计行添加到 SQL 查询的底部

sql - Elasticsearch GROUP BY列的HAVING COUNT> x

java - 数据源的自动提交是否应该设置为 false?

SQL Server SQL JOIN 帮助

c# - LINQ:基于子列表中的属性分组

mysql - SQL Join 分组以获得树状结果

mysql - 如何实现基于同义词的上下文搜索?

php - mysql 查询队列(使用 php/mysql)