sql(1):
------------------------------->
select SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN
WHERE SHOHIN_KBN || TEKIYO_FROM in (0120060811,0120060812,0120060813)
-------------------------------<
sql(2):
------------------------------->
select SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN
WHERE SHOHIN_KBN || TEKIYO_FROM in
(Select B.SHOHIN_KBN || B.TEKIYO_FROM
from (select count(*) over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw,
A.SHOHIN_KBN,
A.TEKIYO_FROM
from (select distinct SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN) A) B
where B.rw >= 4)
-------------------------------<备注子sql:
------------------------------->
(Select B.SHOHIN_KBN || B.TEKIYO_FROM
from (select count(*) over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw,
A.SHOHIN_KBN,
A.TEKIYO_FROM
from (select distinct SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN) A) B
where B.rw >= 4)
-------------------------------<
单独执行结果为:(0120060811,0120060812,0120060813)
------------------------------->
select SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN
WHERE SHOHIN_KBN || TEKIYO_FROM in (0120060811,0120060812,0120060813)
-------------------------------<
sql(2):
------------------------------->
select SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN
WHERE SHOHIN_KBN || TEKIYO_FROM in
(Select B.SHOHIN_KBN || B.TEKIYO_FROM
from (select count(*) over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw,
A.SHOHIN_KBN,
A.TEKIYO_FROM
from (select distinct SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN) A) B
where B.rw >= 4)
-------------------------------<备注子sql:
------------------------------->
(Select B.SHOHIN_KBN || B.TEKIYO_FROM
from (select count(*) over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw,
A.SHOHIN_KBN,
A.TEKIYO_FROM
from (select distinct SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN) A) B
where B.rw >= 4)
-------------------------------<
单独执行结果为:(0120060811,0120060812,0120060813)
解决方案 »
- .dat文件怎样导入oracle数据库???
- 懂Oracle的朋友麻烦来一下,急急急!
- 关于C#要返回Oracel数据集 Oracel中的包
- 怎样在Oracle中,在一个数据库下创建多个用户?
- pl/sql出现乱码
- oracle9的安装问题,再次请高手指教
- oralce 中,应用程序发出的 sql 语句可以加密吗?
- 关于FOR UPDATE的问题,请指教
- 在线等,请问那里有中文版的report教材,谢谢
- Oracle where语句中等号两边的是否可以互换?
- oracle中,查询距当前日期最近的一条记录的语句是什么?类似于sqlserver2000中的top(1)的查询语句。
- 求一简单SQL~
:)
另外,sql(1)有点问题:
select SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN
WHERE SHOHIN_KBN || TEKIYO_FROM in (0120060811,0120060812,0120060813)
改为
select SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN
WHERE SHOHIN_KBN || TEKIYO_FROM in ('0120060811','0120060812','0120060813')
要求类似:按照考试科目,保留每种科目的最高前3名的分数;说明:因为最终目的不是显示(select),是删除(delete)操作,所以不能表之间关联,只能写成类似
delete T_KSI_TRN
where SHOHIN_KBN || TEKIYO_FROM in ......
的样子!所以回答者注意,如有更好写法请指点!!!
问题不在(0120060811,0120060812,0120060813)改成('0120060811','0120060812','0120060813')。
主要是那个“select count(*) over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw ...”中的好像叫‘析构函数’我不太理解它的内核!
前面我说的都是表面现象,不太清楚你的要求。--------------------------------------------------------
sql的意图是:保留每种SHOHIN_KBN(区分)最新3组数据;
要求类似:按照考试科目,保留每种科目的最高前3名的分数;
--------------------------------------------------------按你这种说法,
B.rw >= 4是去掉前三的取法;
B.rw < 4 才是取前三。
----------------
按你这种说法,
B.rw >= 4是去掉前三的取法;
B.rw < 4 才是取前三。
----------------
一样的。如果用B.rw >= 4,我在delete的时候就写成 not in;
如果用B.rw < 4,就 in。
所以B.rw>=4 是去掉前三的取法;
str = "'001','002','003'" , 然后,delete时,where 学生id in (str)
先select 取出实际的前3组数据(key)到后台,之后再把3组数据(key)做成字符串传到delete中就可以了。但这样就不能由一条sql实现了,看看有没有一条delete就能搞定的高人了?
按照partition by 后的字段进行分组统计count(...)里的字段2. 不理解为什么不直接 count(...) over(partition by ...) ,count 的时候是否 order by 没有太大的作用啊?
多日不见了,先前都是4角的时候还与你冲过刺,我慢了下来!--------------
2. 不理解为什么不直接 count(...) over(partition by ...) ,count 的时候是否 order by 没有太大的作用啊?
--------------
是为了倒叙,取出最高的3组分数,为B.rw >= 4 服务的!
(
select rowid from
(select student , score, row_number()over(partition by Subject order by score desc) as rid from tab_score )
where rid >=4
)楼主贴出来的需求没有看得很明白
猜测应该进行按照某字段进行分组排序,删除每组中非前三名的纪录?
不知道理解的是否正确?
是你那样的想法;
但你的sql和我发的类似,执行结果是不一样的:
假设你的子sql
----------
select rowid from
(select student , score, row_number()over(partition by Subject order by score desc) as rid from tab_score )
where rid >=4
----------
得出的数据是(7,8,9);
sql1:delete from tab_score where rowid in (7,8,9)
与
sql2:delete from tab_score where rowid in
(
select rowid from
(select student , score, row_number()over(partition by Subject order by score desc) as rid from tab_score )
where rid >=4
)
应该执行的结果不一样!你用如下的类似数据试试:student score
----------------
01 1
01 2
01 3
01 3
01 7
01 7
01 8
01 9
01 9
01 7
sql1:select * from tab_score where rowid in (7,8,9)
与
sql2:select * from tab_score where rowid in
(
select rowid from
(select student , score, row_number()over(partition by Subject order by score desc) as rid from tab_score )
where rid >=4
)
子sql中不能使用rownum 之类作为删除的条件。
如子sql:
----------
(Select B.SHOHIN_KBN || B.TEKIYO_FROM
from T_KSI_TRN b
where rownum <= 2
)
----------
取出(0120060811,0120060812,0120060813);以下2个sql是不等的:
sql(1):
-----------------
delete T_KSI_TRN
WHERE SHOHIN_KBN || TEKIYO_FROM in (0120060811,0120060812,0120060813)
-----------------
sql(2):
-----------------
delete T_KSI_TRN
WHERE SHOHIN_KBN || TEKIYO_FROM in
(Select B.SHOHIN_KBN || B.TEKIYO_FROM
from T_KSI_TRN b
where rownum <= 2
)
-----------------
count() .... 选出的是有重叠排序记录。
---------- ----------- ----------
1 9 2
1 9 2
1 8 3
1 7 6
1 7 6
1 7 6
1 3 8
1 3 8
1 2 9
1 1 10
---------- ----------- ----------
1 9 1
1 9 2
1 8 3
1 7 4
1 7 5
1 7 6
1 3 7
1 3 8
1 2 9
1 1 10
---------------
row_number() .... 选出的是无重叠排序记录;
count() .... 选出的是有重叠排序记录。
---------------
还真没注意row_number()/count()的区别,但先前是考虑到重复数据的问题,所以有下面的语句:
...
from (select distinct SHOHIN_KBN, TEKIYO_FROM from T_KSI_TRN) A) B
...
其实你关注的地方有点错了,前3名的问题已经可以解决了,但是想删除第4名之后的数据就出问题了!
也就是:
delete student score
from tab_score
WHERE score in (第4名,第5名,...,第10名)<>不等价:
delete student score
from tab_score
(
select rowid from
(select student , score, row_number()over(partition by Subject order by score desc) as rid from tab_score )
where rid >=4
)
老兄你干嘛,做广告也得有点公德,公共场所的‘牛皮癣’咋还贴到这了。没意思了,下次注意点啊!
改了还是可以做好同志的嘛!
今天下班前再结贴大给大家!等等高人指点!!!
谢谢:风云 、笨猫、fengniu
select aaa.*
from t_ksi_trn AAA
where AAA.rowid in
(select t.rowid
from t_ksi_trn t ,
(
select b.shohin_kbn, b.tekiYo_from
from (select dense_rank()over(partition by a.shohin_kbn order by a.tekiyo_from desc) rw,
/*count(*)over(partition by a.shohin_kbn order by a.tekiyo_from desc) rw,*/
a.shohin_kbn,
a.tekiyo_from
from (select distinct shohin_kbn, tekiyo_from
from t_ksi_trn) A)B
where b.rw >=4
)c
where t.shohin_kbn = c.shohin_kbn
and t.tekiyo_from = c.tekiyo_from
)得到的就是楼主想要的16条记录,而不是40条记录
你的回答,我试了一下,没有问题。我再让他们帮忙测试一下。
你能不能简单讲一下,count(*)和dense_rank(), row_number()
的区别呀?
你是不是oracle公司的呀!!!这么厉害!!!想你学习!
不好意思,刚才他们提示我用dense_rank(),可以得出正确的结果;是我忽略了你答案里的这个函数!但有一点还是有疑虑:为什么分别使用count(*)和dense_rank()的sql结果一样, 但作为delete的条件时,执行的结果就不一样?
dense_rank()
count()
row_number()
rank()
进行分组排序,就会发觉它们的妙用。
究竟是该用什么函数,就看你的业务逻辑了。
在网上搜索了一下,大牛们可以看看。SELECT speaker, track, score,
ROW_NUMBER() OVER(ORDER BY score DESC) AS rownum,
NTILE(3) OVER(ORDER BY score DESC) AS tile
FROM SpeakerStats
ORDER BY score DESC以下为结果集:speaker track score rownum tile
---------- ---------- ----------- ------ ----
Jessica Dev 9 1 1
Ron Dev 9 2 1
Suzanne DB 9 3 1
Kathy Sys 8 4 1
Michele Sys 8 5 2
Mike DB 8 6 2
Kevin DB 7 7 2
Brian Sys 7 8 2
Joe Dev 6 9 3
Robert Dev 6 10 3
Dan Sys 3 11 3
ROW_NUMBER() OVER(ORDER BY score DESC) AS rownum,
RANK() OVER(ORDER BY score DESC) AS rnk,
DENSE_RANK() OVER(ORDER BY score DESC) AS drnk
FROM SpeakerStats
ORDER BY score DESC以下为结果集:speaker track score rownum rnk drnk
---------- ---------- ----------- ------ --- ----
Jessica Dev 9 1 1 1
Ron Dev 9 2 1 1
Suzanne DB 9 3 1 1
Kathy Sys 8 4 4 2
Michele Sys 8 5 4 2
Mike DB 8 6 4 2
Kevin DB 7 7 7 3
Brian Sys 7 8 7 3
Joe Dev 6 9 9 4
Robert Dev 6 10 9 4
Dan Sys 3 11 11 5
此问题暂时到此了,有时间我再查delete中的in/not in 有啥限制!
谢谢:风云、笨猫、fengniu
select distinct SHOHIN_KBN, TEKIYO_FROM
from T_KSI_TRN
SHOHIN_KBN TEKIYO_FROM
01 20060811
01 20060812
01 20060813
01 20060814
01 20060819
01 20060820
02 20060811
02 20060812
02 20060813执行下面sql:
select dense_rank() over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw,
rank() over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw1,
ROW_NUMBER() over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw2,
count(*) over(partition by A.SHOHIN_KBN order by A.TEKIYO_FROM desc) rw3,
A.SHOHIN_KBN,
A.TEKIYO_FROM
from (select distinct SHOHIN_KBN, TEKIYO_FROM
from T_KSI_TRN
) A
RW RW1 RW2 RW3 SHOHIN_KBN TEKIYO_FROM
1 1 1 1 01 20060820
2 2 2 2 01 20060819
3 3 3 3 01 20060814
4 4 4 4 01 20060813
5 5 5 5 01 20060812
6 6 6 6 01 20060811
1 1 1 1 02 20060814
2 2 2 2 02 20060813
3 3 3 3 02 20060812
4 4 4 4 02 20060811这几个函数执行的结果没有区别,但是为什么进行delete的时候,结果就不一样了?