group by分组的一个问题

0轰隆隆0 2014-02-27 07:30:57
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的值啊

...全文
585 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼W 2014-05-09
  • 打赏
  • 举报
回复
这个其实很简单 select id,max(num),max(flag)keep(dense_rank last order by num) from table1 group by id
齐岳 2014-03-14
  • 打赏
  • 举报
回复
学习了
大脸猫o 2014-03-13
  • 打赏
  • 举报
回复
引用 3 楼 snbxp 的回复:

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

+1
浮云若水 2014-03-12
  • 打赏
  • 举报
回复
引用 3 楼 snbxp 的回复:

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

+1
gangma2 2014-03-07
  • 打赏
  • 举报
回复
我认为先要从BB表中根据id分组和找出num最大的记录(这里顺便排了下序是结果和作者要求的一样),
然后连接BB表和上面查出来的结果做连接,取出别名为A的那个表的字段,具体如下:
select A.id,A.num,A.flag from BB A join
(select id,max(num) as num from BB group by id order by id) B
on B.id=A.id and B.num=A.num;
查询结果:
zhzhs007 2014-03-01
  • 打赏
  • 举报
回复
楼上正解,用分析函数就可以
snbxp 2014-02-28
  • 打赏
  • 举报
回复

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

_拙计 2014-02-28
  • 打赏
  • 举报
回复
你分组的结果集 再和源表关联下 不就查出flag了
CT_LXL 2014-02-27
  • 打赏
  • 举报
回复
引用 楼主 fulong258 的回复:
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;

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧