【发布时间】:2021-10-14 12:17:36
【问题描述】:
我目前有一个非常大的查询,并且正在尝试以特定方式进一步对数据进行排序。查询以如下方式返回数据,项目按 TimeToComplete 降序排序:
| id | ItemKey |TimeToComplete|
| -------- | -------------- |--------------|
| ABC | KEY-211-01 | 580 |
| DEF | KEY-311-01 | 456 |
| GHI | KEY-111-01 | 150 |
| JKL | KEY-411-01 | 87 |
| XYZ | KEY-311-01 | 23 |
| KNE | KEY-211-01 | 17 |
我要做的是对这些数据进行排序,以便将 ItemKeys 分组在一起,但除此之外仍保留基于组中第一项的 TimeToComplete 排序。像这样的例子:
| id | ItemKey |TimeToComplete|
| -------- | -------------- |--------------|
| ABC | KEY-211-01 | 580 |
| KNE | KEY-211-01 | 17 |
| DEF | KEY-311-01 | 456 |
| XYZ | KEY-311-01 | 23 |
| GHI | KEY-111-01 | 150 |
| JKL | KEY-411-01 | 87 |
我确实有一个部分工作的例子,但它有一些问题:
WITH GroupedRecords AS (
SELECT
OriginalQuery.*,
ROW_NUMBER() OVER (partition by ItemKey order by TimeToComplete DESC) as RN
FROM (originally giant query here) OriginalQuery
),
Sequence AS (
SELECT
ItemKey,
TimeToComplete,
ROW_NUMBER() OVER (order by TimeToComplete DESC) as SequenceOrder
FROM GroupedRecords
WHERE RN = 1
)
select T.*, s.SequenceOrder
from GroupedRecords T
INNER JOIN Sequence S ON T.ItemKey = S.ItemKey
ORDER BY S.SequenceOrder ASC, T.TimeToComplete DESC
这样做的问题是:
- GroupedRecords 和序列之间的内部连接将我的一堆列名(但不是全部)更改为 Oracle 随机生成的名称 (QCSJ_0000006)
- join 也使得查询方式太慢(OriginalQuery 已经不是很优化,但是它的执行时间增加了一倍)
问题: 有没有更有效的方法可以在不使用序列/连接部分的情况下实现这种排序?
【问题讨论】:
标签: sql oracle aggregate-functions partition-by