问题如下
我有很多分类
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名。目前,我不得不使用临时表进行管理。有更好的解决方案吗?
发布于 2017-11-08 22:04:59
最简单的方法是通过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
“以前运行过的”信息需要保存在某个地方。
只需插入您的表名和字段名,您就可以从这里展开。
https://stackoverflow.com/questions/47180830
复制相似问题