如何使用自定义顺序 select 每个子组的第一行?
How to select the first row for every sub group using a custom order?
有Table个人
和一个 Table PersonRecord
我只需要select每个人一个记录,状态最大的记录。
状态按 C > B > A
排序,一个人可以有多个不同或相同状态的记录,我总是需要 select 较大的状态或第一个(如果该人有相同状态的记录)。
我进行以下查询以获取排序的行
select ep.personid, ep.persondesc, records.veryimportantcode, records.status
from extperson ep
left join
(
select rownum as rn, v.* from
(
select pr.personid, pr.veryimportantcode, pr.status
from personrecord pr
group by pr.personid, pr.veryimportantcode, pr.status
order by pr.personid,
decode(pr.status,
'C', 1,'B', 2,'A', 3,
4)
) v
) records
on ep.personid = records.personid
它给我:
我需要
|PERSONID |PERSONDESC|VERYIMPORTANTCODE |STATUS |
|00325465 |Bjork |(null) |(null) |
|00527513 |Paul |ZP-2143540 |A |
|00542369 |Hazard |ZH-7531594 |C |
|0324567 |Jhon |ZJ-2346570 |B |
我尝试使用附加物化子查询来实现此目的,在该子查询中我计算重复次数并使用 where (subquerymat.nrorepeat > 1 and rownum = 1) or (subquerymat.nrorepeat = 1 or subquerymat.nrorepeat is null)
进行左连接,但不起作用。
此查询有一个非常重要的规则,我会将此查询附加到视图内联合的右侧,然后我不能使用存储过程。
尝试:
select personid, persondesc, veryimportantcode, status
from (select pe.personid,
pe.persondesc,
pr.veryimportantcode,
pr.status,
row_number() over(partition by pe.personid order by pr.status desc,
pr.autoid) as rn
from person pe
left join personrecord pr
on pe.personid = pr.personid)
where rn = 1
Fiddle 测试: http://sqlfiddle.com/#!4/25074/2/0
有Table个人
和一个 Table PersonRecord
我只需要select每个人一个记录,状态最大的记录。
状态按 C > B > A
排序,一个人可以有多个不同或相同状态的记录,我总是需要 select 较大的状态或第一个(如果该人有相同状态的记录)。
我进行以下查询以获取排序的行
select ep.personid, ep.persondesc, records.veryimportantcode, records.status
from extperson ep
left join
(
select rownum as rn, v.* from
(
select pr.personid, pr.veryimportantcode, pr.status
from personrecord pr
group by pr.personid, pr.veryimportantcode, pr.status
order by pr.personid,
decode(pr.status,
'C', 1,'B', 2,'A', 3,
4)
) v
) records
on ep.personid = records.personid
它给我:
我需要
|PERSONID |PERSONDESC|VERYIMPORTANTCODE |STATUS |
|00325465 |Bjork |(null) |(null) |
|00527513 |Paul |ZP-2143540 |A |
|00542369 |Hazard |ZH-7531594 |C |
|0324567 |Jhon |ZJ-2346570 |B |
我尝试使用附加物化子查询来实现此目的,在该子查询中我计算重复次数并使用 where (subquerymat.nrorepeat > 1 and rownum = 1) or (subquerymat.nrorepeat = 1 or subquerymat.nrorepeat is null)
进行左连接,但不起作用。
此查询有一个非常重要的规则,我会将此查询附加到视图内联合的右侧,然后我不能使用存储过程。
尝试:
select personid, persondesc, veryimportantcode, status
from (select pe.personid,
pe.persondesc,
pr.veryimportantcode,
pr.status,
row_number() over(partition by pe.personid order by pr.status desc,
pr.autoid) as rn
from person pe
left join personrecord pr
on pe.personid = pr.personid)
where rn = 1
Fiddle 测试: http://sqlfiddle.com/#!4/25074/2/0