2014-11-28 10 views
5

Sposób korzystania z ROW_NUMBER() w klauzuli where w bazie danych DB2. Próbowałem poniżej, ale to nie działa:ROW_NUMBER() w DB2

SELECT * FROM CSPAPP.LOCATIONS 
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200 

Dało błąd: Nieprawidłowe użycie funkcji zbiorczej lub funkcji OLAP.

Próbowałem też z followiong sposoby:

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCATIONS 
WHERE RN < 200 

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,LOCATION FROM CSPAPP.LOCATIONS 
WHERE RN < 200 

Odpowiedz

4

nie można odwołać aliasu na tym samym poziomie, na którym jest ona zdefiniowana. Trzeba owinąć to pod stołem pochodnych:

SELECT location 
FROM (
    SELECT row_number() over(order by location) as rn, 
      location 
    FROM cspapp.locations 
) 
WHERE rn < 200 
+0

dziękuję za rozwiązania, ale to jest częściowo obsługujących mój prupose. Próbuję SELECT * FROM ( SELECT numer_wiersza() ponad (kolejność według lokalizacji) jako rn, * FROM cspapp.locations GDZIE rn <200 Ale to nie działa.Czy sugerujesz. – Mandar

+0

"* nie działa *" nie jest poprawnym komunikatem o błędzie DB2. –

+0

oops.Sorry. Błąd: "Znaleziono nieoczekiwany token * po" według lokalizacji "jako rn.Expected Tokens może zawierać: ." Nie mogę wprowadzić każdej kolumny, ponieważ w tabeli znajduje się około 600 kolumn. Więc muszę użyć *, aby wybrać wszystkie kolumny za jednym zamachem. – Mandar

3

używam coś takiego przy wyborze na podstawie numeru wiersza w iSeries DB2:

SELECT * 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, * 
    FROM CSPAPP.LOCATIONS 
    ) 
WHERE RRN between 100 and 200 

Jeśli jesteś zainteresowany tylko w polu 1 was mogą być w stanie przypisać nazwę do wyboru i odnieść do pól:

SELECT DATA.location 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, * 
    FROM CSPAPP.LOCATIONS 
    ) as DATA 
WHERE DATA.RRN between 100 and 200 
+0

Dziękuję za pomoc. Próbowałem czegoś takiego: WYBIERZ * Z cspapp.locations GDZIE LOKALIZACJA W (WYBIERZ LOKALIZACJĘ Z (WYBIERZ numer_wiersza() ponad (kolejność według lokalizacji) jako rno, LOKALIZACJA Z cspapp.locations) GDZIE rno MIĘDZY 1000 I 10000). To działało. – Mandar

-1

Można odwoływać się do aliasu na tym samym poziomie, na którym jest on zdefiniowany. Trzeba owinąć to pod stołem pochodzącym:

SELECT T1.* FROM(
     SELECT row_number() over(order by location) as rn ,L.* 
     FROM cspapp.locations L) As T1 
WHERE T1.rn < 200 

Ale trzeba zrozumieć * nigdy nie być najlepszym rozwiązaniem. Powinieneś używać nazwy kolumny zamiast * (L.col1).

0

Możesz wypróbować TYLKO 200 PIERWSZYCH RZĘDÓW zamiast numeru wiersza. Napisz swój wybór tak, jak normalnie, bez ROW_NUMBER, zamów wszystko, czego potrzebujesz, i PIERWSZE PIERWSZE x.

wybieranie wszystkich kolumn z "*" nie jest dobrą praktyką zwłaszcza jeśli masz ponad 600 kolumn (a to samo w sobie jest złym projektem bazy danych).

0

Bez użycia funkcji ROW_NUMBER():

SELECT * FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATION FETCH FIRST 200 rows only) 
ORDER BY LOCATION DESC FETCH FIRST 100 rows only; 

With Row number: 

SELECT ROW_NUMBER() OVER(ORDER BY LOCATIONS), LOCATIONS as RNM FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATIONS FETCH FIRST 200 rows only) 
ORDER BY LOCATIONS DESC FETCH FIRST 100 rows only;