SQL Server 获取满足条件的每个条件下的前N条数据
从数据库获取数据时,经常会遇到获取一个数据列表和该列表中每条数据对应的另一个列表的情况,如果二级列表获取的是全部数据,那么就比较简单。如果二级列表获取的是前n条数据,就会比较麻烦。
从操作上来看,好像很简单,可以先从数据库获取一级列表,然后遍历,根据指定条件再次获取二级列表。但是,这样会多次连接数据库,严重影响从数据库获取数据的效率。从效率上考虑,最好是一次全部获取,这时候可以考虑使用分区函数PARTITION BY。
语法:
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
该语法表示根据COL1分组,在分组内部根据 COL2排序,而此语法计算的值就表示每组内部排序后的顺序编号(组内连续、唯一)
示例:
类别表:t_classinfo
classid classname
1 服饰
2 箱包
商品信息表:t_goodsinfo
goodsid goodsname classid ordernum
1 上衣 1 1
2 帽子 1 2
3 裤子 1 3
4 皮夹 2 1
5 钱包 2 2
6 皮带 2 3
获取类别列表和每个类别下的两个商品信息
sql 语句:
select * from t_classinfo select * from (select goodsid,goodsname,(ROW_NUMBER() OVER(PARTITION BY classid ORDER BY ordernum desc)) as rowid from t_goodsinfo) as g where g.rowid<=2 order by classid asc
查询结果:
classid classname
1 服饰
2 箱包
goodsid goodsname rowid
3 裤子 1
2 帽子 2
6 皮带 1
5 钱包 2