1

我正在使用 Oracle 数据库 11g。我有一个查询,其中包括从表中选择一个 ID 和一个日期。基本上,我想要做的是将具有相同 ID 的行保持在一起,然后按“组”中的最近日期对这些行的“组”进行排序。

所以如果我原来的结果是这样的:

ID   Date
3    11/26/11
1    1/5/12
2    6/3/13
2    10/15/13
1    7/5/13

我希望的输出是:

ID   Date
3    11/26/11     <-- (Using this date for "group" ID = 3)
1    1/5/12
1    7/5/13       <-- (Using this date for "group" ID = 1)
2    6/3/13
2    10/15/13     <-- (Using this date for "group" ID = 2)

有没有办法做到这一点?

4

3 回答 3

2

一种方法是使用分析函数。我没有这样方便的例子。

这是另一种获得指定结果的方法,无需使用分析函数(首先按每个 ID 的 most_recent_date 排序,然后按 ID 排序,然后按日期排序):

SELECT t.ID
     , t.Date
  FROM mytable t
  JOIN ( SELECT s.ID
              , MAX(s.Date) AS most_recent_date
           FROM mytable s
          WHERE s.Date IS NOT NULL
          GROUP BY s.ID
       ) r
    ON r.ID = t.ID
 ORDER
    BY r.most_recent_date
     , t.ID
     , t.Date

这里的“技巧”是为每个 ID 返回“most_recent_date”,然后将其连接到每一行。结果可以先排序,然后再排序。

(我也认为有一种方法可以使用分析函数获得相同的排序,但我没有这样方便的示例。)

于 2013-07-25T14:59:34.033 回答
1

您可以将该MAX ... KEEP函数与您的聚合一起使用来创建您的排序键:

with 
  sample_data as
   (select 3 id, to_date('11/26/11','MM/DD/RR') date_col from dual union all
    select 1,  to_date('1/5/12','MM/DD/RR') date_col from dual union all
    select 2, to_date('6/3/13','MM/DD/RR') date_col from dual union all
    select 2, to_date('10/15/13','MM/DD/RR') date_col from dual union all
    select 1, to_date('7/5/13','MM/DD/RR') date_col from dual)
select 
  id,
  date_col,
  -- For illustration purposes, does not need to be selected:
  max(date_col) keep (dense_rank last order by date_col) over (partition by id) sort_key
from sample_data
order by max(date_col) keep (dense_rank last order by date_col) over (partition by id);
于 2013-07-25T15:07:27.063 回答
1

这是使用分析函数的查询:

select 
  id
, date_
, max(date_) over (partition by id) as max_date
  from table_name
  order by max_date, id 
;
于 2013-07-25T15:32:17.133 回答