例如:
id 更新时间 姓名 合同号 状态
1 2022/2/1 1号 123 失效
2 2022/2/3 1号 234 进行中
3 2022/2/5 1号 331 已生效
4 2022/3/1 2号 444 失效
5 2022/2/2 2号 222 已生效
6 2022/1/3 3号 111 失效
7 2022/1/2 3号 123 失效
要求:分页列表每个人只展示一个合同号,优先展示时间最新的一条数据,优先展示状态进行中>已生效(如果时间最新的一条数据状态为已生效,但是同时还有一条数据为进行中,那么就展示进行中的数据)
期望结果:
id 更新时间 姓名 合同号 状态
2 2022/2/3 1号 234 进行中
5 2022/2/2 2号 222 已生效
6 2022/1/3 3号 111 失效
select tt.updatetime,tt.name,tt.hetong,tt.STATUS
from (
SELECT
distinct
id,
updatetime,
NAME,
hetong,
status,
(CASE
WHEN STATUS = '进行中' THEN
2
WHEN STATUS = '已生效' THEN
1 ELSE 0 end)
st
FROM
test3
ORDER BY
st desc,
updatetime DESC
) tt GROUP BY tt.name ,这个可以出结果,不过性能差
select * from
(select *, row_number() over(partition by 姓名 order by 更新时间 desc, status_n) rn from
(select *, case when 状态 = '进行中' then 1 when 状态 = '已生效' then 2 else 3 end status_n from table )
temp_table ) t where rn = 1
思路是先case when给状态排个优先号码然后分区取top1,排序是先时间在状态,你如果状态优先可以换一下
select * from (select ROW_NUMBER()over(partition by 姓名 order by field(状态,进行中,已生效),更新时间 desc) rowId,* from 表名) where rowId=1;