Sql Server sql给分组排序后排好的数据加上序号进行分页查询
今天写代码碰到一个查询需要进行分组排序,并需要对排序后的结果进行分页。苦思许久,灵光一现得出以下处理方式
一、业务场景
首先看数据结构,以下数据杂乱无章
SELECT id, s.sku_no, line, sort, plan_qty, batch FROM cccn_inv_adjust c LEFT JOIN bsc_sku s ON c.sku_id = s.sku_id

要根据batch 批次字段进行分组 在以line及sort进行排序。
通过 row_number ( ) OVER ( partition BY 分组值 ORDER BY 排序值 ASC ) AS n 分组排序后的结果:
SELECT c.id, s.sku_no, c.line, c.sort, c.plan_qty, c.batch, c.n FROM ( SELECT *, row_number ( ) OVER ( partition BY batch ORDER BY line, sort ASC ) AS n FROM cccn_inv_adjust ) c LEFT JOIN bsc_sku s ON c.sku_id = s.sku_id

这样排序后的结果会以batch字段 每组组内有一个规则的排序。但这样的排序无法进行分页,在最外层包裹一下 再来一个 row_number 会打乱现有分组排序的规则。
二、处理方式
于是想要分组排序后进行分页 直接在分组排序查询的结果中增加一列 默认值为1.
SELECT row_number ( ) OVER ( ORDER BY num ASC ) AS rowNo, tab.* FROM ( SELECT c.id, s.sku_no, c.line, c.sort, c.plan_qty, c.batch, c.n, 1 num FROM ( SELECT *, row_number ( ) OVER ( partition BY batch ORDER BY line, sort ASC ) AS n FROM cccn_inv_adjust ) c LEFT JOIN bsc_sku s ON c.sku_id = s.sku_id ) tab ORDER BY rowNo ASC OFFSET 0 ROW FETCH NEXT 20 ROWS ONLY
结果

可以看到 分页查询 row_number 需要指定一列为根据对查询结果集做一个规则的序列号排序,分组排序后不管以哪个字段排序都会打乱现有的分组排序规则。指定一列默认为1的 num 列为根据。它就会依照你查询的结果依次进行排序,不会打乱分组排序的规则
这样的骚操作 既不会打乱分组排序的排序规则,通过也完成了分页查询。

浙公网安备 33010602011771号