2015-05-06 49 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:谨慎解释?如果你认为我的回答有问题,我想猜猜它是什么? –