group by分组的一个有关问题
group by分组的一个问题
id num flag
1 1 1
1 2 2
1 3 3
2 1 1
3 1 1
3 2 2
4 1 1
4 2 3
6 1 1
三个字段都是数字类型
我想得到
id num flag
1 3 3
2 1 1
3 2 2
4 2 3
6 1 1
根据ID分组,找num最大的那一行,我总拿不到flag的值啊
------解决方案--------------------
------解决方案--------------------
id num flag
1 1 1
1 2 2
1 3 3
2 1 1
3 1 1
3 2 2
4 1 1
4 2 3
6 1 1
三个字段都是数字类型
我想得到
id num flag
1 3 3
2 1 1
3 2 2
4 2 3
6 1 1
根据ID分组,找num最大的那一行,我总拿不到flag的值啊
------解决方案--------------------
with t as
(select 1 id, 1 num, 1 flag
from dual
union all
select 1 id, 2 num, 2 flag
from dual
union all
select 1 id, 3 num, 3 flag
from dual
union all
select 2 id, 1 num, 1 flag
from dual
union all
select 3 id, 1 num, 1 flag
from dual
union all
select 3 id, 2 num, 2 flag
from dual
union all
select 4 id, 1 num, 1 flag
from dual
union all
select 4 id, 2 num, 3 flag
from dual
union all
select 6 id, 1 num, 1 flag from dual)
select t1.*, t2.flag
from (select id, max(num) num from t group by id) t1, t t2
where t1.id = t2.id
and t1.num = t2.num
order by t1.id;
------解决方案--------------------
WITH T AS
(SELECT 1 ID, 1 NUM, 1 FLAG FROM DUAL UNION ALL
SELECT 1 ID, 2 NUM, 2 FLAG FROM DUAL UNION ALL
SELECT 1 ID, 3 NUM, 3 FLAG FROM DUAL UNION ALL
SELECT 2 ID, 1 NUM, 1 FLAG FROM DUAL UNION ALL
SELECT 3 ID, 1 NUM, 1 FLAG FROM DUAL UNION ALL
SELECT 3 ID, 2 NUM, 2 FLAG FROM DUAL UNION ALL
SELECT 4 ID, 1 NUM, 1 FLAG FROM DUAL UNION ALL
SELECT 4 ID, 2 NUM, 3 FLAG FROM DUAL UNION ALL
SELECT 6 ID, 1 NUM, 1 FLAG FROM DUAL)
SELECT ID, NUM, FLAG
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY ID ORDER BY NUM DESC) RN, T.*
FROM T)
WHERE RN = 1