group by分组的一个有关问题

group by分组的一个问题
本帖最后由 fulong258 于 2014-02-27 19:32:58 编辑
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