这个sql语句该怎么写?!!!

keaneming 2013-01-12 07:31:52
有这样一个表TABLE
就是要取出ABCDE这5列
A B C D 组合起来肯定是惟一的
但是 ABC相同情况下 只需要取出最大D的这一行数据就好(筛选条件应该跟E无关)
例如:

对于 ABCED
(注意E是排在D前面的)

----------------------------------------------------------
| A | B | C | E | D | | |


----------------------------------------------------------
| 11 | 22 | 33 | A | 0 | | |
----------------------------------------------------------
| 11 | 22 | 33 | B | 2 | | |
----------------------------------------------------------
| 11 | 22 | 33 | C | 1 | | |
----------------------------------------------------------
只需要取出
| 11 | 22 | 33 | B | 2 | | |

就好。。。



再例如
对于下面这个

----------------------------------------------------------
| A | B | C | E | D | | |

----------------------------------------------------------
| 11 | 22 | 33 | A | 0 | | |
----------------------------------------------------------
| 11 | 22 | 33 | B | 2 | | |
----------------------------------------------------------
| 11 | 22 | 33 | C | 1 | | |
----------------------------------------------------------


| 22 | 22 | 33 | D | 0 | | |
----------------------------------------------------------
| 22 | 22 | 33 | B | 1 | | |
----------------------------------------------------------

| 33 | 22 | 33 | C | 2 | | |
----------------------------------------------------------
| 33 | 22 | 33 | A | 3 | | |
----------------------------------------------------------


| 44 | 22 | 33 | K | 0 | | |
----------------------------------------------------------
| 44 | 22 | 33 | A | 1 | | |
----------------------------------------------------------


| 55 | 22 | 33 | Z | 1 | | |
----------------------------------------------------------


需要取出
| 11 | 22 | 33 | B | 2 | | |
----------------------------------------------------------
| 22 | 22 | 33 | B | 1 | | |
----------------------------------------------------------
| 33 | 22 | 33 | A | 3 | | |
----------------------------------------------------------
| 44 | 22 | 33 | A | 1 | | |
----------------------------------------------------------
| 55 | 22 | 33 | Z | 1 | | |
----------------------------------------------------------


现在有用这个max(rowid)方法
但是max(rowid)好像是跟列的排序有关的
如果在table定义的时候,D列排在E列前面的话
就能正确地取出结果
但是E列排在D列前面的话
max(rowid)是会根据E的大小来选择哪一行数据

select * from Table where rowid in (select max(rowid) from Table group by A || B || C);



请帮忙写下这个SQL语句
(不管table定义的时候列的顺序)
运行ok的话马上结贴给分!
多谢!!!
...全文
614 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
keaneming 2013-01-12
  • 打赏
  • 举报
回复
2L是对的 3L的换下列的顺序也ok 谢谢咯 给分结贴!
陈字文 2013-01-12
  • 打赏
  • 举报
回复
引用 4 楼 puyawei 的回复:
引用 3 楼 ziwen00 的回复:2楼把条件调换一下,也是对的,需要按照E来进行关联 SQL code?1234567select w.A, w.B, w.C, w.E, w.D from foo w, (select A, B, C, max(E) as F from foo group by A, B, C) t where w.A = t.A and w……
是的,你的是对的,我把两列搞颠倒了
放开那个衰锅 2013-01-12
  • 打赏
  • 举报
回复
楼上写的是对的
筱伟 2013-01-12
  • 打赏
  • 举报
回复
引用 3 楼 ziwen00 的回复:
2楼把条件调换一下,也是对的,需要按照E来进行关联 SQL code?1234567select w.A, w.B, w.C, w.E, w.D from foo w, (select A, B, C, max(E) as F from foo group by A, B, C) t where w.A = t.A and w.B = t.B and w.C ……
我是完全按照楼主的 A B C E D来的,不是你的A B C D E
陈字文 2013-01-12
  • 打赏
  • 举报
回复
2楼把条件调换一下,也是对的,需要按照E来进行关联

select w.A, w.B, w.C, w.E, w.D
  from foo w, (select A, B, C, max(E) as F from foo group by A, B, C) t
 where w.A = t.A
   and w.B = t.B
   and w.C = t.C
   and E = t.F
 order by w.A, w.B, w.C
查询结果:

11	22	33	2	B
22	22	33	1	B
33	22	33	3	A
44	22	33	1	A
55	22	33	1	Z
陈字文 2013-01-12
  • 打赏
  • 举报
回复
测试脚本(没有用with):

CREATE TABLE foo(
    a VARCHAR2(20),
    b VARCHAR2(20),
    c VARCHAR2(20),
    d VARCHAR2(20),
    e VARCHAR2(20)
);
INSERT INTO foo VALUES ('11','22','33','A','0');
INSERT INTO foo VALUES ('11','22','33','B','2');
INSERT INTO foo VALUES ('11','22','33','C','1');
INSERT INTO FOO VALUES ('11','22','33','A','0');
INSERT INTO FOO VALUES ('11','22','33','B','2');
INSERT INTO FOO VALUES ('11','22','33','C','1');
INSERT INTO FOO VALUES ('22','22','33','D','0');
INSERT INTO FOO VALUES ('22','22','33','B','1');
INSERT INTO FOO VALUES ('33','22','33','C','2');
INSERT INTO FOO VALUES ('33','22','33','A','3');
INSERT INTO FOO VALUES ('44','22','33','K','0');
INSERT INTO FOO VALUES ('44','22','33','A','1');
INSERT INTO FOO VALUES ('55','22','33','Z','1');
查询SQL:

SELECT O.A,O.B,O.C,O.D,O.E FROM 
(SELECT a,b,c,d,e,MAX(e) over(PARTITION BY a,b,c) AS eg FROM foo) o
WHERE o.eg =e;
查询结果:

A	B	C	D	E
11	22	33	B	2
11	22	33	B	2
22	22	33	B	1
33	22	33	A	3
44	22	33	A	1
55	22	33	Z	1
筱伟 2013-01-12
  • 打赏
  • 举报
回复
select w.A, w.B, w.C, w.E, w.D
  from test2 w, (select A, B, C, max(D) as F from test2 group by A, B, C) t
 where w.A = t.A
   and w.B = t.B
   and w.C = t.C
   and D = t.F
 order by w.A, w.B, w.C

17,140

社区成员

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

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