如何从SQL Server中的每个类别获取前n行而不重复下一次调用

时间:2017-11-08 13:21:28

标签: sql sql-server

问题如下

我有很多类别

Category 1:
    Item c-1-1
    Item c-1-2
    Item c-1-3
    Item c-1-4
    Item c-1-5
    Item c-1-6
    Item c-1-7
    Item c-1-8
    Item c-1-9
    Item c-1-10

Category 2:
    Item c-2-1
    Item c-2-2
    Item c-2-3
    Item c-2-4
    Item c-2-5
    Item c-2-6
    Item c-2-7
    Item c-2-8
    Item c-2-9
    Item c-2-10

Category 3:
    Item c-3-1
    Item c-3-2
    Item c-3-3
    Item c-3-4
    Item c-3-5
    Item c-3-6
    Item c-3-7
    Item c-3-8
    Item c-3-9
    Item c-3-10

基于某些参数,我需要从每个类别获得n行。一旦使用了这些项目,那么在下一个查询中,它应该返回前一次调用中未使用的项目。

例如

在第一轮中,如果我取每个类别的前3行。

C-1-1, C-1-2, C-1-3

然后在第二次调用下一个3.

C-1-4, C-1-5, C-1-6

所以在我需要的第四次执行中

C-1-10, C-1-1. C-1-2
C-2-10, C-2-1. C-2-2
and so on.

如何在SQL Server的单个查询中获取此信息?使用排名,您可以获得每个类别的前3名。目前我不得不使用临时表进行管理。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

最简单的方法是通过cte和行号条件进行选择。

DECLARE @N INT = 5;
WITH    cte
          AS (SELECT    Sector
              ,         CompanyName
              ,         ROW_NUMBER() OVER (PARTITION BY Sector ORDER BY CompanyName) RN
              FROM      guid.Companies
              WHERE     Deleted = 0
             )
    SELECT  cte.Sector
    ,       cte.CompanyName
    FROM    cte
    WHERE   RN < @N;

这将为您提供基本详细信息,但为了实现一组不同的结果,我已经添加了一个删除列,需要在执行后设置:

WITH    cte
          AS (SELECT    Sector
              ,         CompanyName
              ,         Deleted
              ,         ROW_NUMBER() OVER (PARTITION BY Sector ORDER BY CompanyName) RN
              FROM      guid.Companies
              WHERE     Deleted = 0
             )
    UPDATE    cte
    SET     Deleted = 1
    WHERE   RN < @N

&#34;之前运行&#34;信息需要在某个地方举行。

只需插入您的表格和字段名称,您就可以从此处进行扩展。