排序后取得特点某条数据问题

shizhusz110 2012-12-19 03:13:59
有一个这样数据结构:
ORDERID , SCORE, TIME,C
1 80, 10, 1
2 70, 20, 1
3 40, 30, 1
1 90, 10, 2
2 80, 10, 2
3 0, 10, 2
有一个这样排序结构表,都按照成绩高低partition by排序
我想取出SCORE>=60的第一行,
即:
ORDERID , SCORE, TIME,C
2 70, 20, 1
2 80, 10, 2

我写了top来,可是数据很慢,谢谢大家帮助!!!
...全文
103 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shizhusz110 2012-12-19
  • 打赏
  • 举报
回复
写了个BUG更正下:

;with tab(ORDERID,SCORE,TIME,C) as
(
   select rank() over(partition by C order by SCORE desc) as ORDERID,
SCORE, TIME,C from # with(nolock)
)select ORDERID , TIME,C,
(select top 1 SCORE from tab where SCORE>=60 and C=a.C order by SCORE asc) SCORE 
from tab a where ORDERID=2
發糞塗牆 2012-12-19
  • 打赏
  • 举报
回复
记得结贴
shizhusz110 2012-12-19
  • 打赏
  • 举报
回复
还好把,我页面处理了下异步加载了!
發糞塗牆 2012-12-19
  • 打赏
  • 举报
回复
大数据量的话速度可以接受不?
shizhusz110 2012-12-19
  • 打赏
  • 举报
回复
谢谢版主, 是快些了!
發糞塗牆 2012-12-19
  • 打赏
  • 举报
回复
试试这样会不会快点:
create table #(SCORE int,[TIME] int ,C int) 
insert into # 
select 80,10,1 union all
select 70,20,1 union all
select 40,30,1 union all
select 90,10,2 union all
select 80,10,2 union all
select 0,10,2  
  
CREATE INDEX IX_Order ON # (c ASC,SCORE DESC )
CREATE INDEX IX_Order2 ON # (SCORE asc )
;with tab as
( 
   select rank() over(partition by C order by SCORE desc) as ORDERID, 
SCORE, TIME,C from # with(nolock) 
)select ORDERID , TIME,C, 
(select top 1 SCORE from tab where SCORE>=60 order by SCORE asc) SCORE  
from tab where ORDERID=2
shizhusz110 2012-12-19
  • 打赏
  • 举报
回复
不好意思,由于实际表结构和我发出来不一样:

create table #(SCORE int,[TIME] int ,C int)
insert into #
select 80,10,1 union all
select 70,20,1 union all
select 40,30,1 union all
select 90,10,2 union all
select 80,10,2 union all
select 0,10,2 


;with tab as
(
   select rank() over(partition by C order by SCORE desc) as ORDERID,
SCORE, TIME,C from # with(nolock)
)select ORDERID , TIME,C,
(select top 1 SCORE from tab where SCORE>=60 order by SCORE asc) SCORE 
from tab where ORDERID=2
發糞塗牆 2012-12-19
  • 打赏
  • 举报
回复
先不考虑改进,你先把语句改对先,报错了。with都不是这样写的。
shizhusz110 2012-12-19
  • 打赏
  • 举报
回复

;with tab as
(
   select rank() over(partition by C order by SCORE desc) as ORDERID,
SCORE, TIME,C from ActPass with(nolock)
)select ORDERID , TIME,C
(select top 1 SCORE from tab where SCORE>=60 order by SCORE asc ) SCORE,
from tab where ORDERID=1
语句是这样不知道又不用改进空间!谢谢
發糞塗牆 2012-12-19
  • 打赏
  • 举报
回复
慢可能是你score没有索引,另外最好给出执行计划看看哪一步占用最多成本

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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