oracle中groupby和orderby混合使用(特殊情况处理)

需求:下面结果集中的记录,根据post字段分组,name字段值合并显示,同时根据item_sort排序。

 首先想到的是这样的:

这样写没有能够达到想要的效果,因为post字段为‘三级领导’的两条记录name字段并没有合并到一行。

于是请教了大佬,使用min函数对item_sort字段处理,这样就不需要在groupby中写item_sort字段,于是就有了下面的语句:

select t2.post,to_char(wm_concat(name)) name,min(item_sort) sort from (
      select t1.post,t1.item_sort,t3.name
      from t_organization_person_req t1
      left join T_SECURITY_PERSON t3 on t3.id=t1.cid
      where t1.org_id=886
   ) t2
 group by t2.POST
 order by sort
### 结合使用 SELECT DISTINCT GROUP BY 的方法 在 SQL 查询中,`SELECT DISTINCT` `GROUP BY` 是两种不同的机制,分别用于去重分组。虽然它们的功能不同,但在某些场景下可以结合使用以实现更复杂的查询需求。 #### 1. 去重与分组的结合 `DISTINCT` 主要用于去除查询结果中的重复行,而 `GROUP BY` 则用于将数据按指定列进行分组,并通常配合聚合函数(如 `COUNT`, `SUM`, `AVG` 等)来计算每个分组的结果。如果需要同时去重分组,可以通过以下方式实现: - **先去重后分组**:可以在子查询中使用 `DISTINCT` 去重,然后在外层查询中使用 `GROUP BY` 进行分组。 ```sql SELECT column_name, aggregate_function(column_name) FROM ( SELECT DISTINCT column_name FROM table_name ) AS subquery GROUP BY column_name; ``` 这种方式适用于需要先去除重复记录再进行分组的场景[^1]。 - **先分组后去重**:也可以先使用 `GROUP BY` 对数据进行分组,然后在外层查询中使用 `DISTINCT` 去重。 ```sql SELECT DISTINCT column_name, aggregate_function(column_name) FROM ( SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name ) AS subquery; ``` 这种方式适用于需要先对数据进行分组统计,然后再去除重复记录的场景[^3]。 #### 2. 示例:查找所有状态为 0 的还书流水号并去除重复 假设需求是查找所有状态 (`book_repay_status`) 为 0 的还书流水号 (`repay_code`),要求去除重复,并按照还书提交时间 (`book_repay_date`) 排序。此外,对于相同的还书流水号,如果有重复记录,排序的时间以最新(即最晚)时间为准。 可以使用以下查询实现: ```sql SELECT repay_code, MAX(book_repay_date) AS latest_book_repay_date FROM repay_record WHERE book_repay_status = '0' GROUP BY repay_code ORDER BY latest_book_repay_date; ``` 在这个查询中: - 使用 `GROUP BY` 按照 `repay_code` 分组。 - 使用聚合函数 `MAX` 获取每个 `repay_code` 对应的最新 `book_repay_date`。 - 最后通过 `ORDER BY` 按照最新的还书提交时间排序[^5]。 #### 3. 注意事项 - 如果直接在查询中使用 `DISTINCT` `GROUP BY`,可能会导致语法错误或逻辑问题。这是因为 `DISTINCT` `GROUP BY` 的作用范围不同,不能直接混合使用。 - 在某些数据库系统中(如 Oracle),如果 `DISTINCT` `GROUP BY` 的列不一致,可能会引发异常。例如,Oracle 的 `ORA-01791` 错误提示需要明确排序依据[^5]。 #### 4. 性能优化 - 如果查询涉及大量数据,建议对相关列(如 `repay_code`, `book_repay_date`)创建索引,以提高查询性能[^2]。 - 避免在子查询中执行过多的复杂操作,尽量简化查询逻辑。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值