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

本文详细解析了SQL语句查询分类前几条信息的方法,包括使用ROW_NUMBER(), CROSSAPPLY, 子查询及另一种未详细解释的方法。通过实例展示了如何使用这些方法查询特定类别下的前三条记录,并按照指定字段排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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)

### SQL 按指定列排序语句SQL 中,`ORDER BY` 子句用于对查询结果按照某一列或多列进行排序。默认情况下,数据会以升序排列(ASC),如果需要降序排列,则可以显式地加上 `DESC` 关键字。 以下是种常见的按指定列排序的方式: #### 基本语法 ```sql SELECT column1, column2, ... FROM table_name ORDER BY column ASC|DESC; ``` 其中,`column` 是要排序的列名,`ASC` 表示升序,默认值;`DESC` 表示降序。 #### 示例 1:单列排序 假设有一个名为 `employees` 的表,包含员工姓名 (`name`) 和工资 (`salary`) 列。如果我们想根据工资从低到高排序: ```sql SELECT name, salary FROM employees ORDER BY salary ASC; -- 默认为升序,可省略 ASC ``` 如果我们希望从高到低排序,则需使用 `DESC`: ```sql SELECT name, salary FROM employees ORDER BY salary DESC; ``` #### 示例 2:多列排序 当需要基于多个字段进行排序时,可以在 `ORDER BY` 后面依次列出这些字段分别指定其排序方式。 ```sql SELECT name, department, hire_date FROM employees ORDER BY department ASC, hire_date DESC; -- 首先按部门升序,再按入职日期降序 ``` #### 自定义排序 (CASE WHEN) 对于某些特殊需求,可能需要自定义排序逻辑。例如,将特定城市优先显示出来,可以通过 `CASE WHEN` 实现[^1]: ```sql SELECT * FROM Citys ORDER BY CASE WHEN City = '北京' THEN 1 WHEN City = '天津' THEN 2 WHEN City = '上海' THEN 3 ELSE 4 END; ``` 此方法允许开发者灵活控制记录的展示顺序,而不仅仅是依赖于自然数值或字母顺序。 #### 排序限制返回行数 有时还需要结合分页功能来获取部分有序的结果集。比如只取 10 条最高薪资的数据[^2]: ```sql SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10; ``` 以上就是关于 SQL 查询中如何实现不同类型的排序操作介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值