2011-09-05 33 views
6

Próbuję pobrać ogromny zestaw rekordów z Teradata za pomocą JDBC. I potrzebuję rozbić ten zestaw na części, dla których używam klauzuli "Top N" w select. ale nie wiem jak ustawić „Offset” jak jak to robimy w MySQL -Teradata - ograniczanie wyników przy użyciu TOP

SELECT * FROM tbl LIMIT 5,10 

tak, że w przyszłym SELECT będzie pobierał mi rekordy z (n + 1) th pozycji.

Odpowiedz

5

RANK i zakwalifikować wierzę są znajomych

np

SEL RANK(custID), custID 
FROM mydatabase.tblcustomer 
QUALIFY RANK(custID) < 1000 AND RANK(custID) > 900 
ORDER BY custID; 

RANK (pole) będzie (koncepcyjnie) pobrać wszystkie wiersze wynikowego, zamówić je przez ORDER BY dziedzinie i przypisz do nich przyrostowy identyfikator rangi.

QUALIFY pozwala ci to pokroić, ograniczając wiersze zwrócone do wyrażenia kwalifikacji, które teraz mogą legalnie przeglądać RANKy.

Żeby było jasne, ja zwrotu 900-1000th wierszy w zapytaniu zaznacz wszystko od cusotmers, NIE powrocie klientom identyfikatorów pomiędzy 900 i 1000.

+0

dzięki. tego właśnie szukałem. – Aanand

+0

Sugerowałbym użycie zagregowanej wersji okna 'RANK ({kolumna})' idąc dalej. RANK przedstawiony w tej odpowiedzi został uznany za przestarzały od czasu Teradata 12. 'RANK() OVER (ORDER BY custID) AS Rank_', a następnie' QUALIFY on Rank_ BETWEEN 900 AND 1000'. Jeśli dodasz klauzulę "PARTITION BY" (opcjonalnie), możesz zresetować ranking, gdy zmieni się zestaw partycjonowania kolumn. Pamiętaj, że jeśli kolumna, którą zamawiasz, nie jest unikalna, RANK nie zapewni Ci czystej sekwencji. –

5

Można również użyć kruszywo ROW_NUMBER okna na Teradata.

SELECT ROW_NUMBER() OVER (ORDER BY custID) AS RowNum_ 
    , custID 
    FROM myDatabase.myCustomers 
QUALIFY RowNum_ BETWEEN 900 and 1000; 

przeciwieństwie kruszywa RANK okien, ROW_NUMBER zapewni Ci sekwencję niezależnie od tego, czy kolumna zamawiania przez opcjonalny zestaw partycji jest unikatowy lub nie.

Kolejna opcja do rozważenia.