sql删除记录语句:取出表内分类前N条记录的SQL语句



表结构

现在有章表 A

ct name
1 X
1 x
1 X
1 X
1 X
2 X
2 X
2 X
2 X
3 X
3 X
3 X
3 X
4 X
4 X

通过查询 查出每类前3

ct name
1 X
1 x
1 X
2 X
2 X
2 X
3 X
3 X
3 X
4 X
4 X







SQL语句写法有4种



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)

Tags:  sql语句 删除记录语句 sql修改记录语句 sql删除记录语句

延伸阅读

最新评论

发表评论