删除 sql 中的重复记录
Remove duplicated record in sql
我想做的是获取如下所示的记录:
ID NAME STARTDATE ENDDATE EnrollmentMonth
1 PETER 20190101 20200729 20200701
1 TONY 20200730 99991231 20200701
并将其更改为如下所示:
ID NAME STARTDATE ENDDATE EnrollmentMonth
1 PETER 20190101 20200729 20200701
除去注册天数较少的名字,Peter 7 月注册了 29 天,Tony 7 月注册了 2 天。
想法是在七月只选一个名字。
我很难完成这项工作。任何帮助将不胜感激。
谢谢
如果只想要入学天数最少的 7 月的记录,可以使用日期算法,order by
和 fetch first
:
select *
from mytable
where enrollmentmonth = date '2020-07-01'
order by least(enddate, date '2020-07-31') - greatest(startdate, '2020-07-01')
fetch first row with ties
我们可以使用 window 函数在 per-month 的基础上实现相同的逻辑:
select *
from (
select t.*,
rank() over(
partition by enrollmentmonth
order by least(enddate, last_day(enrollmentmonth)) - greatest(startdate, trunc(enrollmentmonth, 'month'))
) rn
from mytable t
) t
where rn = 1
我想做的是获取如下所示的记录:
ID NAME STARTDATE ENDDATE EnrollmentMonth
1 PETER 20190101 20200729 20200701
1 TONY 20200730 99991231 20200701
并将其更改为如下所示:
ID NAME STARTDATE ENDDATE EnrollmentMonth
1 PETER 20190101 20200729 20200701
除去注册天数较少的名字,Peter 7 月注册了 29 天,Tony 7 月注册了 2 天。
想法是在七月只选一个名字。
我很难完成这项工作。任何帮助将不胜感激。
谢谢
如果只想要入学天数最少的 7 月的记录,可以使用日期算法,order by
和 fetch first
:
select *
from mytable
where enrollmentmonth = date '2020-07-01'
order by least(enddate, date '2020-07-31') - greatest(startdate, '2020-07-01')
fetch first row with ties
我们可以使用 window 函数在 per-month 的基础上实现相同的逻辑:
select *
from (
select t.*,
rank() over(
partition by enrollmentmonth
order by least(enddate, last_day(enrollmentmonth)) - greatest(startdate, trunc(enrollmentmonth, 'month'))
) rn
from mytable t
) t
where rn = 1