绝对经典sql语句查询分类前几条信息 ,并按某字段排序
2011-08-19 09:39
741 查看
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)
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)
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)
相关文章推荐
- 11、SQL Server:绝对经典sql语句查询分类前几条信息 ,并按某字段排序(有点东西没看懂)
- 绝对经典sql语句查询分类前几条信息 ,并按某字段排序
- 查询mysql表字段信息的sql语句
- SQL查询所有表,字段名,主键,类型,长度,小数位数等信息【经典】
- 常用的文章系统,如何用一条sql语句提取出每个分类的第一条并按OrderCol字段排序。分类大概几十个,一共只要取top 10 这样
- sql查询语句_多字段分类汇总_多表合并
- Oracle 中查询字段详细信息的sql 语句
- gbase,hive,teradata,db2,oracle数据库查询字段信息,类型,注释的sql语句.
- 数据库查询语句,oracle查询一个表中字段相同信息的个数并按个数排序
- 查询相册里的照片,每个分类只显示4条信息(经典SQL)
- sql server 查询表信息,字段,数据类型的sql语句
- SQL语句查询重复字段并按数量排序
- crmsql语句查询实体窗体实体字段关系信息
- 取出相应用户分类名以及字段id的sql语句(两表查询)
- 使用正则表达式获取Sql查询语句各项(表名、字段、条件、排序)
- SQL语句查询数据库所有表和所有字段的详细信息(包括表描述和字段描述)
- sql语句查询一个表里面无重复并且按照指定字段排序的sql语句
- SQL 语句查询表字段信息,及字段备注
- SQL语句查询表结构信息(字段信息)
- 常用的文章系统,如何用一条sql语句提取出每个分类的第一条并按OrderCol字段排序。分类大概几十个,一共只要取top 10 这样