问题如下
我有很多类别
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名。目前我不得不使用临时表进行管理。有更好的解决方案吗?
答案 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;信息需要在某个地方举行。
只需插入您的表格和字段名称,您就可以从此处进行扩展。