说我有下表
ID | Name
1 | John
2 | Kevin
2 | Sam
2 | Fred
3 | Frank
3 | Jessica
4 | Emily
5 | Lauren
6 | James
如何配置偏移量以便我只计算不同的ID值? 所以,如果它是
OFFSET @Start ROWS FETCH NEXT 3 ROWS ONLY
我的结果看起来像
1 John
2 Kevin
2 Sam
2 Fred
3 Frank
3 Jessica
现在它正在选择3个不同的ID值。基本上,有没有办法在使用行偏移时按不同的值进行分页?
答案 0 :(得分:0)
使用子查询为每个id组生成行号,然后在结果上使用offset函数。
该内部查询将从您的表中选择所有内容:
ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [NAME]) as RowNum
然后只选择RowNum = 1
的行答案 1 :(得分:0)
你不能用offset
做到这一点,我不这么认为。相反,您可以枚举不同的值并一次选择三个。
select t.id, t.name
from (select t.*, dense_rank() over (order by id) as seqnum
from table t
) t
where (seqnum - 1) / n = @start
order by id;
您每次都会将@start
增加1。
请注意,如果您想获得3行然后保持联系,您可以使用:
select top 3 with ties t.id, t.name
from table t
order by id;
答案 2 :(得分:0)
以下是实现此目的的几种方法。我会尝试几种情况,看看哪种情况最适合你的情况。
DECLARE @start int = 0
SELECT * FROM tbl
WHERE id IN (
SELECT id
FROM tbl
GROUP BY id
ORDER BY id ASC
OFFSET @Start ROWS FETCH NEXT 3 ROWS ONLY
)
另一种选择:
DECLARE @start int = 0
;WITH cte AS (
SELECT *, DENSE_RANK() OVER (ORDER BY ID) AS num
FROM tbl
)
SELECT * FROM cte
WHERE num BETWEEN @start AND @start+3