2016-08-10 5 views
1

Ich habe zwei Tabellen: Tabelle ASQL auf Datum basiert join

+-------+----------+ 
| prop | str_date | 
+-------+----------+ 
| AL408 | 3/1/2009 | 
| AL408 | 4/1/2009 | 
| AL408 | 5/1/2009 | 
| AL408 | 6/1/2009 | 
+-------+----------+ 

Tabelle B

+---------+-----------+----------+ 
| prop_id | agrx_date | brand_id | 
+---------+-----------+----------+ 
| AL408 | 5/5/1986 | CI  | 
| AL408 | 6/30/1994 | CI  | 
| AL408 | 5/3/1999 | CI  | 
| AL408 | 4/21/2006 | CI  | 
| AL408 | 3/20/2009 | QI  | 
+---------+-----------+----------+ 

Ich ziehe in brand_id in mein Ergebnis Abfrage möchten aber die brand_id ändert sich entsprechend durch den Vergleich str_date zu agrx_date. Für den Monat, nachdem sich eine brand_id über das agrx_date geändert hat, würde das Ergebnis diese neue brand_id widerspiegeln. Alle str_dates sind monatliche Werte.

Das Endergebnis würde wie folgt aussehen:

+-------+----------+--------+ 
| prop | str_date | Result | 
+-------+----------+--------+ 
| AL408 | 3/1/2009 | CI  | 
| AL408 | 4/1/2009 | QI  | 
| AL408 | 5/1/2009 | QI  | 
| AL408 | 6/1/2009 | QI  | 
+-------+----------+--------+ 

Hier ist, was ich bisher (was nicht korrekt ist) und ich bin nicht sicher, wie mein Endergebnis zu erhalten.

Ich gebe dies durch Tableau, so kann ich CTE oder andere temporäre Tabellen nicht verwenden.

+1

Bitte geben Sie Ihre detaillierte Logik an, um das veröffentlichte Ergebnis zu generieren. –

+0

Bitte lassen Sie mich wissen, wie Sie das Datum hier vergleichen – robinbansalsolutions

+0

Ich habe die Frage bearbeitet. – Bernardo

Antwort

1

Sie können einen Datumsbereich mit einer analytischen Funktion lead() erstellen. Der Datumsbereich könnte dann als Teil eines Theta-Joins verwendet werden, um die richtige Marke einzubinden. Dies ist eine ziemlich einfache Möglichkeit, den Datumswert aus dem nächsten Datensatz zu ziehen, siehe die Definition von next_agrx_date unten.

Der Bereich wäre für den Start inklusive (>=), aber am Ende nichtinklusiv (<). Sie müssen auch den Null-Fall für offene Bereiche behandeln. Sie finden diese Logik in der Verknüpfung unten.

select 
    a.prop 
    ,a.str_date 
    ,b.agrx_date 
    ,b.brand_id 
from tableA a 
left join 
(select 
    prop 
    ,agrx_date 
    ,brand_id 
    ,lead(agrx_date) over (partition by prop order by agrx_date) next_agrx_date 
    from tableB) b 
on (b.prop = a.prop and a.str_date >= b.agrx_date and (a.str_date < b.next_agrx_date or b.next_agrx_date is null)) 
order by prop, str_date 
+0

Fantastisch, das funktioniert. Vielen Dank! – Bernardo

0

Sie können DATE_FORMAT verwenden, um die Datumsangaben für die Formatierung zu ändern.

Beispiel

DATE_FORMAT(str_date,'%m-%d-%Y') 

oder was auch immer Feld und Format, das Sie verwenden möchten.

Verwandte Themen