oracle 分组排序

在Oracle数据库中,可以使用窗口函数(Window Functions)进行分组排序。以下是几种常用的分组排序函数及其用法:

  1. ROW_NUMBER() OVER()
  • 功能 :为每个分组的记录分配一个唯一的行号,行号从1开始,按照排序列的顺序递增。

  • 语法

    ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2 DESC)
    ```

- **示例** <b class="card40_249__sup_a7f6" data-sup="sup">4</b>:

```sql
    SELECT *, 
           ROW_NUMBER() OVER (PARTITION BY courseName ORDER BY courseScore DESC) AS courseRank 
    FROM sddbtmp.coursr;
    ```

2. **RANK() OVER()** <b class="card40_249__sup_a7f6" data-sup="sup">3</b>

- **功能** :为每个分组的记录分配一个排名,排名从1开始,当排序列的值相同时,排名会相同,且排名之间会跳过相应的名次。

- **语法** <b class="card40_249__sup_a7f6" data-sup="sup">4</b>:

```sql
    RANK() OVER (PARTITION BY column1 ORDER BY column2 DESC)
    ```

- **示例** <b class="card40_249__sup_a7f6" data-sup="sup">4</b>:

```sql
    SELECT *, 
           RANK() OVER (PARTITION BY courseName ORDER BY courseScore DESC) AS courseRank 
    FROM sddbtmp.coursr;
    ```

3. **DENSE_RANK() OVER()** <b class="card40_249__sup_a7f6" data-sup="sup">3</b>

- **功能** :为每个分组的记录分配一个排名,排名从1开始,当排序列的值相同时,排名会相同,且排名之间不会跳过相应的名次。

- **语法** <b class="card40_249__sup_a7f6" data-sup="sup">4</b>:

```sql
    DENSE_RANK() OVER (PARTITION BY column1 ORDER BY column2 DESC)
    ```

- **示例** <b class="card40_249__sup_a7f6" data-sup="sup">4</b>:

```sql
    SELECT *, 
           DENSE_RANK() OVER (PARTITION BY courseName ORDER BY courseScore DESC) AS courseRank 
    FROM sddbtmp.coursr;
    ```

### 分组内排序<b class="card40_249__sup_a7f6" data-sup="sup">6</b>

如果你需要在分组内部进行排序,可以先使用`PARTITION BY`进行分组,然后在每个分组内部使用窗口函数进行排序。例如:

```sql
SELECT * 
FROM (
    SELECT *, 
           ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) AS rank 
    FROM emp
) 
WHERE rank <= 3

注意事项

  1. 分组字段和排序字段 :确保在PARTITION BY子句中指定的字段与在ORDER BY子句中指定的字段一致。

  2. 窗口函数的使用 :窗口函数可以在SELECT列表、ORDER BY子句和PARTITION BY子句中使用,用于实现复杂的排序和分组逻辑。

  3. 性能考虑 :使用窗口函数可能会对查询性能产生影响,特别是在处理大量数据时。建议在实际应用中进行充分的测试和优化。

通过以上方法,你可以轻松地在Oracle数据库中实现分组排序。

Top