Postgres: links beitreten mit order by und limit 1

9

Ich habe die Situation:

%Vor%

Da sich Unternehmen im Laufe der Zeit verschieben können, führt ein LEFT JOIN dazu, dass mehrere Datensätze für jedes Unternehmen erstellt werden.

Die Felder

begin und end sind niemals NULL. Um die letzte Adresse zu finden, verwenden Sie ORDER BY being DESC . Um ältere Adressen zu entfernen, verwenden Sie LIMIT 1 .

Das funktioniert gut, wenn die Abfrage nur 1 Firma bringen kann. Aber ich brauche eine Abfrage, die alle Table1-Datensätze mit ihren aktuellen Table2-Adressen verknüpft. Daher muss die Entfernung veralteter Daten (AFAIK) in der ON-Klausel von LEFT JOIN erfolgen.

Irgendeine Idee, wie ich die Klausel erstellen kann, um nicht doppelte Table1-Firmen zu erstellen und neueste Adresse zu bringen?

    
Hikari 17.02.2014, 19:23
quelle

2 Antworten

3

Ich habe es mit der Windows-Funktion gelöst:

%Vor%

row_number () erstellt einen int-Zähler für jeden Datensatz innerhalb jedes auf fk_company basierenden Fensters. Für jedes Fenster kommt der Datensatz mit dem spätesten Datum zuerst mit Rang 1, dann stellt dt_last_addr = 1 sicher, dass der JOIN nur einmal für jeden fk_company auftritt, mit dem Datensatz mit der letzten Adresse.

Window-Funktionen sind sehr mächtig und wenige ppl verwenden sie, sie vermeiden viele komplexe Joins und Unterabfragen!

    
Hikari 19.02.2014, 13:13
quelle
10

Verwenden Sie eine abhängige Unterabfrage mit der Funktion max () in einer Join-Bedingung.
Etwas wie in diesem Beispiel:

%Vor%

demo: Ссылка

    
krokodilko 17.02.2014 21:40
quelle