Jak pobrać tylko kilka pozycji dla danego indeksu

0

Nie bardzo wiem ja sformułować samo pytanie więc zacznę od przykładu. :)
Mam powiedzmy tabelę zamówień z zawierającą kolumny id i data
W wyniku zapytania chciałbym dla każdego id z tabeli z otrzymać trzy ostatnie daty zamówienia
Proszę o pomoc.
Dialekt: Firebird

0

Tak bym to zrobił
SELECT TOP 3 ... ... ORDER BY data DESC

0

Dzięki, ale Twoje zapytanie zwróci tylko 3 wiersze dla pierwszego z brzegu id.
Ja potrzebuję po trzy najświeższe wiersze dla każdego id czyli coś takiego :

id1 data1
id1 data2
id1 data3

id2 data4
id2 data5
id2 data6
...

Szukam raczej rozwiązania bez użycia kursora, bo z kursorem wiadomo, łatwo ale długo :)

1

Nie wiem, czy masz Firebirda 3 (w dwójce chyba nie było jeszcze funkcji okna). Jeśli tak, to sprawdź coś takiego:

SELECT id, data
FROM (
  SELECT id, data, rank() OVER (
      PARTITION BY id ORDER BY data DESC
      ) r
  FROM NAZWA_TABELI
  ) a
WHERE r <= 3
0

Dzięki Fac!
Twoje sugestia works like a charm jak mawiają Rosjanie ;)
Jedyne co musiałem zmienić, to rank na row_number, bo daty mi się powtarzają i zarówno rank jak i dense_rank zwracał więcej niż 3 pozycje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1