如何在列表排序时跳过重复记录,例如,
我有桌子:
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
答案 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 ...