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 列为根据。它就会依照你查询的结果依次进行排序,不会打乱分组排序的规则

  这样的骚操作  既不会打乱分组排序的排序规则,通过也完成了分页查询。

 

posted @ 2022-06-09 15:52  Sir奔  阅读(1645)  评论(0)    收藏  举报