2015-05-06 22 views
5

Mam tabelę, w której chcę wybrać ostatnie 10% wierszy, przesunięte o 10% (dlatego chcę wybrać ostatnie 80-90% danych).Wybierz środkowe wiersze w SQL Server

napisałem następujące zapytanie

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

Ale pojawia się następujący błąd:

Line 5: Incorrect syntax near 'OFFSET'.

Co robię źle? Używam programu Microsoft SQL Server 2012, który powinien być kompatybilny z OFFSET

+0

Czy to faktyczne zapytanie, które zgłasza błąd? Jest poprawny t-sql i działa dobrze dla mnie. – jpw

+1

Nie można użyć PRZESUNIĘCIE z GÓRNĄ. zobacz [MSDN] (https://technet.microsoft.com/en-us/library/gg699618 (v = sql.110) .aspx) –

Odpowiedz

4

spróbować czegoś jak ten ....

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

Niezły! Podwójne sortowanie może być kosztowne. – Andomar

+0

Dziękuję @Andomar, Właśnie próbowałem twojej sugerowanej metody przeciwko mojej i wydaje mi się, że twoje rozwiązanie nie skaluje się bardzo dobrze. Im większy stół, tym gorzej. Oto, co przetestowałem. ["SQL FIDDLE"] (http://sqlfiddle.com/#!6/9eecb7db59d16c80417c72/10), skrzypce nie działa, ale zapytanie jest tam i oto, jak wyglądają plany wykonania ["Plan wykonania" ] (http://tinypic.com/r/2s1rukw/8). Myabe Przerobiłem coś, ale proszę, chciałbym poznać twoje przemyślenia na ten temat :) –

+0

Twoje zapytania nie używają procentu na zrzucie ekranu. –

1

Dla Twojego komunikatu o błędzie, czy Twoja baza danych jest ustawiona na backwards compatibility mode?

Wyrażenie offset umożliwia tylko określenie numerów wierszy, a nie wartości procentowych. Można wybrać 80-90 centyl jak:

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

''numer_elementu" nie jest rozpoznawaną nazwą funkcji. " Używam sql -server, ale mam również zainstalowaną wersję 2005/2008. – Bijan

+3

'row_number()' [został wprowadzony w 2005 r.] (Https://msdn.microsoft.com/en-us/library/ms186734 (v = sql.90) .aspx). Czy sprawdziłeś poziom swojego partnera? – Andomar

+0

Mój poziom zgodności jest dla 2000 i ponieważ mam dostęp tylko do odczytu, nie mogę go zmodyfikować. – Bijan

0

można wykorzystać prosty stary dobry nie w:

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: czy wyjaśnić? Jeśli myślisz, że coś jest nie tak z moją odpowiedzią, czy mam zgadywać, co to jest? –

Powiązane problemy