2015-05-06 81 views
5

我有一張表,我想選擇最後10%的行,偏移10%(所以我想選擇最後的80-90%的數據)。在SQL Server中選擇中間行

我寫了下面的查詢

SELECT TOP 10 PERCENT 
    [col1], [col2] 
FROM [table] 
ORDER BY [col1] DESC 
OFFSET 10 ROWS 

但我收到以下錯誤:

Line 5: Incorrect syntax near 'OFFSET'.

我在做什麼錯?我正在使用Microsoft SQL Server 2012,它應該兼容OFFSET

+0

這是引發錯誤的實際查詢?這是有效的t-sql,它對我來說工作正常。 – jpw

+1

您不能對TOP使用OFFSET。請參閱[MSDN](https://technet.microsoft.com/en-us/library/gg699618(v = sql.110).aspx) –

回答

4

嘗試這樣的事情....

SELECT TOP (50) PERCENT * 
FROM (
     SELECT TOP (20) PERCENT 
         [col1] 
        ,[col2] 
     FROM [table] 
     ORDER BY [col1] DESC 
    )T 
ORDER BY [col1] ASC 
+0

好的!雙重排序可能很昂貴 – Andomar

+0

謝謝@Andomar,剛剛嘗試了您的建議方法來對付我的方法,而且在我看來,您的解決方案不能很好地擴展。表越大,表現得越差。這是我測試過的。 ['SQL FIDDLE'](http://sqlfiddle.com/#!6/9eecb7db59d16c80417c72/10),小提琴不起作用,但查詢在那裏,這裏是執行計劃的外觀['Execution Plan' ](http://tinypic.com/r/2s1rukw/8)。 Myabe我看了一些東西,但請我想知道你的想法:) –

+0

你的查詢沒有在屏幕截圖中使用百分比。 –

1

對於您的錯誤消息,您的數據庫是否設置爲backwards compatibility mode

offset表達式僅允許您指定行號而不是百分比。您可以選擇80-90個百分點,如:

select * 
from (
     select 100.0 * row_number() over (order by FirstName desc)/
        count(*) over() as perc_pos 
     from YourTable 
     ) as SubQueryAlias 
where 80 <= perc_pos and perc_pos < 90 
+0

''row_number'不是一個可識別的函數名稱。' 我正在運行sql服務器,但我也安裝了2005/2008。 – Bijan

+3

'row_number()'[在2005年推出](https://msdn.microsoft.com/en-us/library/ms186734(v = sql.90).aspx)。你有沒有檢查你的compat水平? – Andomar

+0

我的兼容性級別爲2000,因爲我擁有隻讀訪問權限,所以無法對其進行修改。 – Bijan

0

您可以使用一個簡單的好老不中:

SELECT TOP 10 PERCENT [col1], [col2] 
FROM [table] 
WHERE [col1] NOT IN (
    SELECT TOP 10 PERCENT [col1] 
    FROM [table] 
    ORDER BY [col1] DESC 
) 
ORDER BY [col1] DESC 
+0

@downvoter:謹慎解釋?如果你認爲我的回答有問題,我想猜猜它是什麼? –