Mam tabelę, w której chciałbym przedstawić dane "uszeregowane X z Y" dla. W szczególności chciałbym móc przedstawić te dane dla pojedynczego wiersza w stosunkowo wydajny sposób (tj. Bez wybierania każdego wiersza w tabeli). Sam ranking jest dość prosty, to proste ORDER BY na jednej kolumnie w tabeli.Jak powinienem obsłużyć dane "rankingu x z Y" w PostgreSQL?
Postgres wydaje się przedstawiać wyjątkowe wyzwania w tym zakresie; AFAICT nie ma RANKU lub ROW_NUMBERa lub równoważnej funkcji (przynajmniej w 8.3, na którym utknąłem na chwilę). Odpowiedź kanoniczna w archiwach listy dyskusyjnej wydaje się być stworzenie sekwencji czasowej i wybierz z niej:
test=> create temporary sequence tmp_seq;
CREATE SEQUENCE
test=*> select nextval('tmp_seq') as row_number, col1, col2 from foo;
Wydaje się, że to rozwiązanie wciąż nie pomoże, gdy chcę wybrać tylko jeden wiersz z tabeli (i chcę wybrać go przez PK, a nie według rangi).
Mogę denormalizować i przechowywać rangę w osobnej kolumnie, co sprawia, że prezentowanie danych jest banalne, ale po prostu przesuwa mój problem. AKTUALIZACJA nie obsługuje ORDER BY, więc nie jestem pewien, w jaki sposób utworzyć zapytanie UPDATE, aby ustawić rangi (nie trzeba wybierać każdego wiersza i uruchamiać oddzielnej aktualizacji dla każdego wiersza, co wydaje się zbyt dużą uruchamiać za każdym razem, gdy rangi wymagają aktualizacji).
Czy brakuje mi czegoś oczywistego? W jaki sposób to zrobić?
EDIT: Najwyraźniej nie byłem wystarczająco jasny. Jestem świadomy OFFSET/LIMIT, ale nie widzę, jak to pomaga rozwiązać ten problem. Nie próbuję wybrać pozycji w rankingu X, próbuję wybrać dowolną pozycję (według jej PK, powiedzmy), a następnie być w stanie wyświetlić użytkownikowi coś w rodzaju "pozycja 43 na 312."
Ta składnia jest pewnie o wiele ładniejsza. Może będę musiał rozważyć, co trzeba zrobić, aby uaktualnić. –
Na razie nigdy nie spotkałem się z problemem związanym z aktualizacją z wcześniej zaprojektowaną bazą danych, a korzyści są liczne. Jeden z moich klientów odkrył jednak, że dzięki nowej metodzie 'HashAggregate'' DISTINCT' niekoniecznie sortuje, co zepsuło niektóre z jego zapytań. To on winien, oczywiście, ale upewnij się, że twoje pytania nie polegają na tych trikach. – Quassnoi
Pierwotne pytanie określone 8.3, ale zdecydowałem, że warto było uaktualnić do 8,4, aby uzyskać dostęp do tych funkcji. Działa świetnie, dzięki za odpowiedź! –