假设我有下表
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 值。那么本质上,有没有办法在使用行偏移时按不同值进行分页?
你不能用
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;
这里有几种方法可以实现这一点。我会尝试几种方案,看看哪种方案最适合您的性能情况。
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
使用子查询为每个 id 组生成行号,然后对结果使用偏移函数。
该内部查询将从表中选择所有内容,并且:
ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [NAME]) as RowNum
然后仅选择 RowNum = 1 的行
CTE 可以有一个带有 OFFSET 的 ORDER BY。因此,CTE 有 3 个不同的 ID(从某个偏移量开始,最初为 0),然后可以将它们连接到原始表以获取具有完整详细信息的所有行
;with y as
(
SELECT DISTINCT t.ID
FROM some_table t
ORDER BY t.Name OFFSET @rowOffset ROWS FETCH NEXT 3 ROWS ONLY
)
SELECT t.*
FROM y
JOIN some_table t ON y.ID = t.ID