PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wydajne zapytanie o najnowsze rekordy za pomocą Postgresql

Jeśli nie chcesz zmieniać modelu danych, możesz użyć DISTINCT ON aby pobrać najnowszy rekord z tabeli "b" dla każdego wpisu w "a":

SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC

Jeśli chcesz uniknąć „sortowania” w zapytaniu, dodaj indeks podobny do tego może pomóc, ale nie jestem pewien:

CREATE INDEX b_id_date ON b (id, date DESC)

SELECT DISTINCT ON (b.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY b.id, b.date DESC

Alternatywnie, jeśli chcesz w jakiś sposób posortować rekordy z tabeli „a”:

SELECT DISTINCT ON (sort_column, a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY sort_column, a.id, b.date DESC

Alternatywne podejścia

Jednak wszystkie powyższe zapytania nadal muszą odczytać wszystkie przywoływane wiersze z tabeli „b”, więc jeśli masz dużo danych, może to być po prostu zbyt wolne.

Możesz utworzyć nową tabelę, która będzie zawierała tylko najnowszy rekord „b” dla każdego a.id -- lub nawet przenieść te kolumny do samej tabeli „a”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę zwrócić '0' z zapytania w pgsql, jeśli wiersz nie istnieje?

  2. Używanie pg_dump do pobierania instrukcji wstawiania tylko z jednej tabeli w bazie danych

  3. Szkolenie PostgreSQL dla MySQLerów

  4. Niezdefiniowana metoda Railsów dla ActiveRecord_Associations_CollectionProxy

  5. Nextval PostgreSQL i curval w tym samym zapytaniu