2011-01-25 95 views
24

如何根據我提供的數字參數從子查詢中返回每個第012條記錄的記錄每個第n條記錄的返回行

例如,我可以具有以下查詢:

SELECT 
    Id, 
    Key 
FROM DataTable 
WHERE CustomerId = 1234 
ORDER BY Key 

例如

子查詢結果可能類似如下:

Row Id Key 
1 1 A3231 
2 43 C1212 
3 243 E1232 
4 765 G1232 
5 2432 E2325 
... 
90 3193 F2312 

如果我通過在30號,子查詢結果集包含90條記錄,我就收到了, ,和第90行行。

如果我通過在40號,結果集包含90條記錄,我就收到了和行。

作爲備註,對於背景信息,這被用於捕獲尋呼控制的每第n個記錄的關鍵字/標識。

+0

請注意,如果沒有`ORDER BY`,您將以隨機順序得到結果,因此您可能只限於* first * N結果。 – 2011-01-25 23:02:16

+0

@Oli謝謝,忘了補充一點。結果將始終以相同的順序排列,並且永遠不會改變。 – 2011-01-25 23:04:24

回答

43

這就是ROW_NUMBER可以提供幫助的地方。它需要一個order-by子句,但這是可以的,因爲order-by是存在的(並且需要保證特定的順序)。

SELECT t.id, t.key 
FROM 
(
    SELECT id, key, ROW_NUMBER() OVER (ORDER BY key) AS rownum 
    FROM datatable 
) AS t 
WHERE t.rownum % 30 = 0 -- or % 40 etc 
ORDER BY t.key 
+2

@pst:`ROW_NUMBER`窗口函數不是專有的TSQL擴展。它是SQL標準的一部分(因爲我相信SQL2003)。 – LukeH 2011-01-26 08:41:00

7

您不必使用行號,任何整數字段都可以。在大多數表格中,我們有一個自動編號字段。爲了簡單起見,我會稱它爲ID。要顯示每13日記錄:

Select ID, LastName, FirstName FROM Users WHERE ID%13 = 0 ORDER BY ID 
1

選擇B.name(由(選擇名稱, 'P1' 訂貨)爲ROW_NUM,A.name 從[DBO]訂貨選擇ROW_NUMBER()OVER(ORDER 。[every_2nd_record])A)B 其中B.row_num%2 = 0