仅计算具有行偏移量的不同行

问题描述 投票:0回答:4

假设我有下表

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 值。那么本质上,有没有办法在使用行偏移时按不同值进行分页?

sql sql-server t-sql
4个回答
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;

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

0
投票

使用子查询为每个 id 组生成行号,然后对结果使用偏移函数。

该内部查询将从表中选择所有内容,并且:

ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [NAME]) as RowNum

然后仅选择 RowNum = 1 的行


0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.