2010-02-16 13 views
12

Jak można uzyskać n-ty wiersz (tj. 5. wiersz) z wyniku zapytania w SQL Server?Jak uzyskać n-ty wiersz w tabeli programu SQL Server?

+0

chcesz kwerendy SQL, która zwraca wartości w kolumnie zdefiniowanej jako piąta kolumna w tej tabeli? Taki, że gdyby wstawić kolejną kolumnę jako drugą kolumnę, wypchnąć kolejne kolumny w dół, to zapytanie, które omawiamy, zwróci następnie to, co poprzednio było czwartą kolumną? –

+1

Proszę wyjaśnić swoje pytanie. Szukasz piątego wiersza lub piątej kolumny? –

+0

Ponieważ tytuł pytania brzmi "Jak uzyskać n-tego wiersza w tabeli SQL Server" Myślę, że jest całkiem jasne, że chce piąty wiersz, a nie piąta kolumna. – mwigdahl

Odpowiedz

8

Masz wiele opcji, opartych na this link. Wszystkie te techniki odnoszą się do SQL 2000. Ten, którego wcześniej używałam, to opcja nr 1, gdzie bierzesz podzbiór 5-elementowy uporządkowany w jedną stronę, a następnie wybierasz wiersz "TOP" z podzbioru zamawianego w inny sposób. Działa świetnie!

SELECT TOP 1 FName 
FROM 
( 
    SELECT TOP 5 FName 
    FROM Names 
    ORDER BY FName 
) sub 
ORDER BY FName DESC 

W SQL 2005 i nawet łatwiej - trzeba wierszy funkcji zamawiania takich jak ROW_NUMBER() który zrobi co trzeba bezpośrednio.

+4

ROW_NUMBER() jest obecny w SQL Server 2005 ... – AdaTheDev

+0

Zmodyfikowany, dziękuję! – mwigdahl

+0

Zwróć uwagę, że jeśli użyjesz tej metody i n <5 wierszy, otrzymasz n-ty wiersz, a nie nic. Na przykład, jeśli w nazwach są 4 wiersze, to spowoduje to powrót do 4. wiersza. To może być dobre lub złe w zależności od tego, czego się spodziewasz. –

17

SQL Server 2005 i nowszych:

with Records AS(select row_number() over(order by datecreated) as 'row', * 
       from Table) 
select * from records 
where row=5 

Można zmienić kolejność przez w celu ustalenia, w jaki sposób posortować dane, aby uzyskać piątym rzędzie.

Testowany na mojej lokalnej instalacji: Microsoft SQL Server 2005 - 9.00.4053.00 (X64) 26 maja 2009 14:13:01 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition (wersja 64-bitowa) w systemie Windows NT 6.1 (Kompilacja 7600:)

+0

Działa wspaniale, ale tylko dla SQL 2008. – mwigdahl

+2

Nie działa dobrze na SQL 2005, który jest tym, na którym działa – JoshBerke

+0

Mój błąd, 2005 i wyżej, wspierają to. Dzięki Josh! – mwigdahl

8

Począwszy od 2005 r. Dostępna jest funkcja ROW_NUMBER().

SELECT * FROM 
(
    SELECT r.*, ROW_NUMBER() OVER (ORDER BY SomeField ASC) AS RowNum 
) sorty 
WHERE RowNum = 5 
0

trochę więcej/inna niż ty prosiłeś, ale tutaj jest kilka rzeczy: Powiedzmy, że masz potrzebę znalezienia n-tego wiersza z jednej tabeli, w określonej kolejności datetime i wstawić wartość z nim do inna tabela, jeśli jej unikalny identyfikator nie znajduje się już w drugiej tabeli. Otrzyma wartość z pierwszego n-tego wiersza tabeli. myuniquecol jest identifer/col identyfikujący grupę rzędami, które mają taką samą wartość w pierwszej tabeli, które posiadają wartości mydatetime

(SELECT TOP 1 mycol FROM 
    (SELECT TOP 5 * FROM mytable 
     WHERE mytable.myuniquecol NOT IN (select myuniquecol from myothertable) 
     AND mytable.myuniquecol = myuniquecol 
     ORDER BY myuniquecol asc, mydatetime desc 
    ) AS me 
    ORDER BY myuniquecol desc, mydatetime asc 
) AS mycolnew 

Jest to użyteczne, aby znaleźć n-tego wiersza w jednej tabeli i włożyć jako n-ty kol w innym stole.

tabela1: myuniquecol, Mycol, mydatetime

Tabela 2: myuniquecol, mycol1, mycol2, mycol3 ...

powinien działać w każdym SQL :)

UWAGA: mojatabela zawiera kolumnę o nazwie Mycol

EDIT: wyjął kilka rzeczy, ponieważ SQL Server ograniczeń na szczycie

+0

FYI, zrobił to w ten sposób, ponieważ pytanie było nieco niejednoznaczne. –

3

Można użyć funkcji Common Table Expression (CTE) i funkcji okna, ROW_NUMBER() (zgodność z SQL 2005), aby rozwiązać problem.

Załóżmy, że nazwa tabeli jest tableOne i ma trzy kolumny (col1, col2, Col3)

się, aby definicja pełna, trzeba określić kolejność, w odniesieniu do którego chcesz wierszy numerowanych . Poniższe skrypty powinny pomóc ci uzyskać n-ty rząd tabeli.


--table definition 
create table tableOne 
(
    col1 varchar(10) 
    ,col2 varchar(10) 
    ,col3 varchar(10) 
) 
go 
-- sample data creation 
insert into tableOne VALUES ('c11','c12','c13') 
insert into tableOne VALUES ('c21','c22','c23') 
insert into tableOne VALUES ('c31','c32','c33') 
insert into tableOne VALUES ('c41','c42','c43') 
insert into tableOne VALUES ('c51','c52','c53') 
insert into tableOne VALUES ('c61','c62','c63') 
go 
-- obtaining nth row using CTE and Window Function 
WITH NthRowCTE AS 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY col1) AS RNum 
     , * 
    FROM tableOne 
) 
SELECT * FROM NthRowCTE WHERE RNum = 5 
GO 

Z CTE i funkcja okna, masz pełną swobodę do danych wyjściowych, jak chcesz.

1

Jeśli używasz SQL Serever 2005 lub nowszego możesz użyć funkcji CTE.

W przeciwnym wypadku można skorzystać z tej prostej kwerendy

SELECT TOP 1 EmpID 
FROM (SELECT TOP 5 EmpID FROM EmpMaster ORDER BY Salary) T 
ORDER BY Emp DESC 
0

SIMPLE

- zwraca pierwszy rekord

select * from tytułów WHERE 1 = (select count (title_id) z tytułów b gdzie a.title_id> = b.title_id)

- powrót drugi rekord i tak dalej select * from tytułów WHERE 2 = (select count (title_id) z tytułów gdzie a.title_id b> = b.title_id)

Powiązane problemy