2014-12-04 52 views
0

說我有如下表只計算不同的行與行偏移

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值。所以基本上,有沒有一種方法可以在使用行偏移量時通過不同的值進行分頁?

+1

在SQL Server偏移取WITH TIES不支持。您可以使用分析RANK而不是OFFSET – Multisync 2014-12-04 22:05:50

+0

通過id使用dense_rank分區 – 2014-12-04 22:19:45

回答

0

使用子查詢爲每個id組生成行號,然後對結果使用偏移函數。

內心的查詢將會從您的表中選擇一切:用ROWNUM = 1

0

你不能用一個offset做到這一點,我不認爲

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

,然後只選擇行。相反,您可以枚舉不同的值並一次選擇三個值。

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