2016-04-18 11 views
0

Ich muss einen Join erstellen, der mir die neuesten Preis für jedes Produkt geben wird. Ich habe die Tabellenstrukturen für den Zweck des Beispiels stark vereinfacht, und jede Tabellenzeile zählt in Millionen. Meine vorherigen Stiche bei diesem waren nicht gerade sehr effektiv.postgres beitreten max Datum

products

prices

+1

http://meta.stackoverflow.com/questions/285551/why-may-i- nicht-upload-images-of-code-auf-so-wenn-eine-frage/285557 # 285557 –

+0

Liegt die Frage daran, dass Sie Probleme beim Schreiben der Abfrage haben, um korrekte Ergebnisse zu erhalten? Oder dass Sie Probleme haben, die Abfrage effizient zu schreiben? –

+0

@MarkHildreth Ich kann den ganzen Tag lang "funktionierende" Abfragen schreiben, solange der Datensatz klein ist. Sobald ich versuche, diese Unterabfrage-Joins auf meinen großen dbs auszuführen, gibt es nie Ergebnisse zurück. Also, ja, das Problem ist sicherlich Effizienz. – bopritchard

Antwort

0

Der einfachste Weg, es wird mit der row_number Funktion zu tun.

select p.name,t.amount as latest_price 
from (select p.*, row_number() over(partition by product_id order by create_date desc) as rn 
     from prices p) t 
join products p on p.id = t.product_id 
where rn = 1 
0

In PostgreSQL, könnten Sie DISTINCT ON versuchen nur in absteigender create_date, um die erste Zeile pro Produkt-ID zu erhalten;

SELECT DISTINCT ON (products.id) products.*, prices.* 
FROM products 
JOIN prices 
    ON products.id = prices.product_id 
ORDER BY products.id, create_date DESC 

(natürlich mit Ausnahme illustrativen Zwecken, sollten Sie die genauen Spalten natürlich wählen Sie benötigen)