【问题标题】:Oracle SQL order within partition分区内的 Oracle SQL 顺序
【发布时间】:2016-02-24 08:57:52
【问题描述】:

我有一个视图,其中结果按序列的降序返回。结果集中的一列是correlation_id,对于一堆行是相同的。我希望按照创建时间戳的顺序在correlation_id的分区内应用排序。

数据: -------------------------- 序列 | CORRELATION_ID | CR_TIMESTAMP 9 | Z | 22/FEB/16 03:00:19.191000000 下午 8 | Z | 22/FEB/16 02:00:26.577000000 下午 7 | Z | 22/FEB/16 01:07:58.171000000 下午 6 |一个 | 22/FEB/16 03:07:58.171000000 下午 5 |一个 | 22/FEB/16 02:07:58.171000000 下午 我想要的是保持原始顺序,仅按 CR_TIMESTAMP 在分区内排序: -------------------------- 序列 | CORRELATION_ID | CR_TIMESTAMP | SRLNO 7 | Z | 22/FEB/16 03:07:58.171000000 下午 | 1 8 | Z | 22/FEB/16 02:00:26.577000000 下午 | 2 9 | Z | 22/FEB/16 01:07:58.171000000 下午 | 3 5 |一个 | 22/FEB/16 02:07:58.171000000 下午 | 1 6 |一个 | 22/FEB/16 03:07:58.171000000 下午 | 2 我试过(没有成功) 选择 V.*, ROW_NUMBER() OVER(按 CORRELATION_ID 分区 ORDER BY CR_TIMESTAMP ASC) 作为来自 A_VIEW V 的 SRLNO;

我的尝试结果为:最终结果按 CORRELATION_ID 升序排列。即所有 A,然后所有 B,然后 .. 所有 Z。在每个分区中,排名正确地按 CR_TIMESTAMP 的顺序排列。

【问题讨论】:

  • 我不确定我是否完全理解您。您的查询有什么问题?
  • 在外面通过SEQ下单。
  • add ORDER BY CORRELATION_ID ,ROW_NUMBER() OVER (PARTITION BY CORRELATION_ID ORDER BY CR_TIMESTAMP ASC)
  • 能否请您告诉我您希望在分区后看到什么类型的数据

标签: sql database oracle window-functions


【解决方案1】:

我是这样理解你的请求的:你首先想要CORRELATION_IDZ,因为它的最高SEQ(9)高于A的最高SEQ(6),但在每个CORRELATION_ID里面你想要你的记录按日期排序。

select seq, correlation_id, cr_timestamp
from mytable
order by max(seq) over (partition by correlation_id) desc, cr_timestamp desc;

【讨论】:

  • 谢谢 :) 这完美!没想到正常的order by也支持分区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2021-02-07
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多