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

时间:2014-12-04 21:58:04

标签: sql sql-server tsql

说我有下表

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

3 个答案:

答案 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