Oracle,按排序

时间:2016-05-19 09:46:12

标签: sql oracle greatest-n-per-group

如何在列表排序时跳过重复记录,例如,
我有桌子:

EmpID   Date          Dept    OtherField
1       2017.02.03    11      1
1       2016.02.03    11      2
1       2015.02.03    13      7
1       2014.02.03    21      6
1       2013.02.03    21      12
1       2012.02.03    13      333

我需要得到:

1       2016.02.03    11
1       2015.02.03    13
1       2013.02.03    21
1       2012.02.03    13

4 个答案:

答案 0 :(得分:8)

感谢您的澄清。我相信Tabibitosan符合您的需求:

with sample_data as (select 1 empid, to_date('03/02/2017', 'dd/mm/yyyy') dt, 11 dept, 1 otherfield from dual union all
                     select 1 empid, to_date('03/02/2016', 'dd/mm/yyyy') dt, 11 dept, 2 otherfield from dual union all
                     select 1 empid, to_date('03/02/2015', 'dd/mm/yyyy') dt, 13 dept, 7 otherfield from dual union all
                     select 1 empid, to_date('03/02/2014', 'dd/mm/yyyy') dt, 21 dept, 6 otherfield from dual union all
                     select 1 empid, to_date('03/02/2013', 'dd/mm/yyyy') dt, 21 dept, 12 otherfield from dual union all
                     select 1 empid, to_date('03/02/2012', 'dd/mm/yyyy') dt, 13 dept, 333 otherfield from dual)
select   empid,
         min(dt) dt,
         dept
from     (select empid,
                 dt,
                 dept,
                 row_number() over (partition by empid order by dt)
                   - row_number() over (partition by empid, dept order by dt) grp
          from   sample_data)
group by empid,
         dept,
         grp
order by empid,
         dt desc;


     EMPID DT               DEPT
---------- ---------- ----------
         1 2016.02.03         11
         1 2015.02.03         13
         1 2013.02.03         21
         1 2012.02.03         13

答案 1 :(得分:1)

创意:Partition by重复字段,使用row_number()来获取第一行 实现:

select EmpID, Date, Dept, OtherField
from ( select EmpID, Date, Dept, OtherField, 
                row_number() over (partition by empid, dept order by date asc) rwn
       from table_name) t
where rwn = 1;

根据您的expected result,我认为您需要empid, dept分区,并获得date分钟。如果没有,请随意更改查询。

答案 2 :(得分:0)

使用group by

select EmpID, MIN(Date) as Date, Dept
from t
group by EmpId, Dept
order by EmpID, MIN(Date) DESC;

答案 3 :(得分:-1)

这将消除重复记录:

select UNIQUE ...