您的位置:首页 > 数据库

绝对经典sql语句查询分类前几条信息 ,并按某字段排序

2011-09-21 10:59 525 查看
sql语句查询分类前几条信息

1.SQL2005,情况下使用 行号 Row_Number()

SELECT *

FROM

(

SELECT ROW_NUMBER() OVER(PARTITION BY ct ORDER BY name) AS rnk,*

FROM tb_name

) AS t

WHERE rnk<=3

讲解:用ROW_NUMBER() 以ct字段划分表数据,为每行数据添加行号。然后从这个结果集里查询出行号小于等于3的记录,就是每类的前3条记录。

2.使用 CROSS APPLY

SELECT DISTINCT b.*

FROM tb_name AS a

CROSS APPLY

(

SELECT TOP 3 *

FROM tb_name

WHERE a.ct=ct

) AS b ORDER BY b.ct

讲解:主要利用CROSS APPLY,这类似join.

首先在子查询里查询出表里每类的前3条记录,然后利用CROSS APPLY 和 DISTINCT ,把查询里相同的记录过滤掉。就是前3条记录了。

不过这样的效率很低,不推荐使用。

3. 利用子查询

SELECT *

FROM tb_name AS t

WHERE 3>(SELECT COUNT(*)

FROM tb_name

WHERE ct=t.ct

AND name>t.name);

讲解:关键是子查询,这里类似一个while循环,每条记录去匹配和它同类的下一条记录。计算以它开始算起记录条数,意思就是他当前所在的行号,当行号小于3的时候,证明他下面有至多3条记录,则符合子查询条件,返回到结果集里。这样就查询出了每类的前3条记录。

4.这种,我没有仔细看。就不讲解了,不过原理大概也就先是取每类的前3条记录,然后在结果集里用in最终取出结果。

select * from @t a

where checksum(*) in (select top 3 checksum(*) from @t b where a.ct=b.ct order by name desc)


绝对经典SQL---分类查询前3条记录,并按某字段排序

sql天地 2006-08-28
17:43:59 阅读54 评论2 字号:大中

现有一表(成绩)

id 姓名 科目 成绩

----------- ---------- ---------- -----------

1 小A 语文 70

2 小A 数学 80

3 小A 英语 90

4 小B 语文 71

5 小B 数学 81

6 小B 英语 91

7 小C 语文 72

8 小C 数学 82

9 小C 英语 92

现在想查出每个学生的最高成绩科目的姓名,科目,成绩等信息,请问怎么写呢?

select *

from

成绩 a

where a.id in(select top 1 id

from 成绩

where 姓名=a.姓名

group by id,成绩

order by 成绩 desc)

如果想要查询前N条的记录的,可以改(TOP N)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐