Problematiche relative alla gestione di Database
 

problemi di join

mmm 15 Ott 2014 14:46
ho usato un subject "semplice" perche' non riesco a descrivere la
situazione in maniera concisa:

il database usato e' un postgresql8.4

devo fare il join tra 2 tabelle su campi di tipo "date", nella prima
tabella la colonna da joinare e' completa ( sono presenti tutti i
valori ) , nella seconda tabella i valori presenti sono sparsi, magari
ce ne e' solo uno su sette o dieci
avrei bisogno che in assenza di data nella seconda tabella venga usato
il record con la data appena precedente ( che e' garan*****o esserci SEMPRE )

attualmente per risolvere il problema espando la seconda tabella in una
tabella ausiliaria che e' la sua versione completa e poi faccio il join
convenzionale, soluzione che pero' non mi piace moltissimo, anche
perche' le due tabelle si espandono progressivamente ( la prima
giornalmente in maniera automatica, la seconda a comando )

faccio un esempio esemplificativo di quello che vorrei avere:

tabella A:
k1 v1
'2014-10-1','AA'
'2014-10-2','BB'
'2014-10-3','CC'
'2014-10-4','DD'
'2014-10-5','EE'
'2014-10-6','FF'
'2014-10-7','GG'

tabella B:
k2 v2
'2014-10-1','A1'
'2014-10-4','A2'
'2014-10-7','A3'

join tabella A con tabella B :
A.k1 A.v1 B.k2 B.v2
2014-10-1 AA 2014-10-1 A1
2014-10-2 BB 2014-10-1 A1 <- notare lo shift
2014-10-3 CC 2014-10-1 A1
2014-10-4 DD 2014-10-4 A2
2014-10-5 EE 2014-10-4 A2
2014-10-6 FF 2014-10-4 A2
2014-10-7 GG 2014-10-7 A3
Marco aka FreCho 20 Ott 2014 15:05
On Wed, 15 Oct 2014 14:46:12 +0200, mmm wrote:

> ho usato un subject "semplice" perche' non riesco a descrivere la
> situazione in maniera concisa:
>
> il database usato e' un postgresql8.4
>
> devo fare il join tra 2 tabelle su campi di tipo "date", nella prima
> tabella la colonna da joinare e' completa ( sono presenti tutti i valori
> ) , nella seconda tabella i valori presenti sono sparsi, magari ce ne e'
> solo uno su sette o dieci avrei bisogno che in assenza di data nella
> seconda tabella venga usato il record con la data appena precedente (
> che e' garan*****o esserci SEMPRE )
>
> attualmente per risolvere il problema espando la seconda tabella in una
> tabella ausiliaria che e' la sua versione completa e poi faccio il join
> convenzionale, soluzione che pero' non mi piace moltissimo, anche
> perche' le due tabelle si espandono progressivamente ( la prima
> giornalmente in maniera automatica, la seconda a comando )
>
> faccio un esempio esemplificativo di quello che vorrei avere:
>
> tabella A:
> k1 v1 '2014-10-1','AA'
> '2014-10-2','BB'
> '2014-10-3','CC'
> '2014-10-4','DD'
> '2014-10-5','EE'
> '2014-10-6','FF'
> '2014-10-7','GG'
>
> tabella B:
> k2 v2 '2014-10-1','A1'
> '2014-10-4','A2'
> '2014-10-7','A3'
>
> join tabella A con tabella B :
> A.k1 A.v1 B.k2 B.v2 2014-10-1 AA 2014-10-1 A1 2014-10-2 BB
> 2014-10-1 A1 <- notare lo shift 2014-10-3 CC 2014-10-1 A1
2014-10-4
> DD 2014-10-4 A2 2014-10-5 EE 2014-10-4 A2 2014-10-6 FF 2014-10-4
> A2 2014-10-7 GG 2014-10-7 A3




Ciao,

con la colonna di tipo DATE non è impossibile (essendo possibile
un'ordinamento), per l'altra non mi è venuto in mente nulla.
TEstato su uan 8.3, non ho 8.4 a disposizione, ma non credo ci siano
problemi.


------------ CONTESTO:

dbhist=# select * from t1;
k1 | v1
------------+----
2014-10-01 | AA
2014-10-02 | BB
2014-10-03 | CC
2014-10-04 | DD
2014-10-05 | EE
2014-10-06 | FF
2014-10-07 | GG
(7 rows)

dbhist=# select * from t2;
k2 | v2
------------+----
2014-10-01 | A1
2014-10-04 | A2
2014-10-07 | A3
(3 rows)

dbhist=# select * from t1 inner join t2 on (t1.k1=t2.k2);
k1 | v1 | k2 | v2
------------+----+------------+----
2014-10-01 | AA | 2014-10-01 | A1
2014-10-04 | DD | 2014-10-04 | A2
2014-10-07 | GG | 2014-10-07 | A3
(3 rows)

dbhist=# select * from t1 left outer join t2 on (t1.k1=t2.k2);
k1 | v1 | k2 | v2
------------+----+------------+----
2014-10-01 | AA | 2014-10-01 | A1
2014-10-02 | BB | |
2014-10-03 | CC | |
2014-10-04 | DD | 2014-10-04 | A2
2014-10-05 | EE | |
2014-10-06 | FF | |
2014-10-07 | GG | 2014-10-07 | A3
(7 rows)

------------ (SEMI) SOLUZIONE:

dbhist=# select t1.k1, t1.v1, case when t2.k2 IS NULL then (select max
(t2.k2) from t2 where t2.k2 <= t1.k1) else t1.k1 end, t2.v2 from t1 left
outer join t2 on (t1.k1=t2.k2);

k1 | v1 | k1 | v2
------------+----+------------+----
2014-10-01 | AA | 2014-10-01 | A1
2014-10-02 | BB | 2014-10-01 |
2014-10-03 | CC | 2014-10-01 |
2014-10-04 | DD | 2014-10-04 | A2
2014-10-05 | EE | 2014-10-04 |
2014-10-06 | FF | 2014-10-04 |
2014-10-07 | GG | 2014-10-07 | A3
mmm 20 Ott 2014 17:13
Marco aka FreCho wrote:
> On Wed, 15 Oct 2014 14:46:12 +0200, mmm wrote:
>
>
>>ho usato un subject "semplice" perche' non riesco a descrivere la
>>situazione in maniera concisa:
>>
>>il database usato e' un postgresql8.4
>>
>>devo fare il join tra 2 tabelle su campi di tipo "date", nella prima
>>tabella la colonna da joinare e' completa ( sono presenti tutti i valori
>>) , nella seconda tabella i valori presenti sono sparsi, magari ce ne e'
>>solo uno su sette o dieci avrei bisogno che in assenza di data nella
>>seconda tabella venga usato il record con la data appena precedente (
>>che e' garan*****o esserci SEMPRE )
>>
>

<snip>

> Ciao,
>

in primis ti ringrazio per la pazienza, visto che ti sei messo a
digitare i dati dell'esempio


> con la colonna di tipo DATE non è impossibile (essendo possibile
> un'ordinamento), per l'altra non mi è venuto in mente nulla.
> TEstato su uan 8.3, non ho 8.4 a disposizione, ma non credo ci siano
> problemi.
>

tra 8.3 a 9.x non mi sembra che ci siano sostanziali aggiunte in questo
ambito

era "sottinteso" che il dato della colonna di join e' ti tipo ordinale,
altrimenti tutta la MIA pippa non aveva senso

effettivamente la soluzione e' parziale, ma mi ha dato degli ottimi
spunti che dovro' approfondire ( nota: le altre colonne da t2 servono in
quanto ci sono i dati significativi per le successive elaborazione)

provero' a seguire la strada di una subquery ( with t_temp as (....) )
in cui avere la data per la seconda tabella e poi fare un join a 3:

t1 -> t_temp -> t2

dove in t_temp per ogni riga di t1 ci faccio arrivare la data "giusta"
per t2

>
> ------------ CONTESTO:
>
> dbhist=# select * from t1;
> k1 | v1
> ------------+----
> 2014-10-01 | AA
> 2014-10-02 | BB
> 2014-10-03 | CC
> 2014-10-04 | DD
> 2014-10-05 | EE
> 2014-10-06 | FF
> 2014-10-07 | GG
> (7 rows)
>
> dbhist=# select * from t2;
> k2 | v2
> ------------+----
> 2014-10-01 | A1
> 2014-10-04 | A2
> 2014-10-07 | A3
> (3 rows)
>
> dbhist=# select * from t1 inner join t2 on (t1.k1=t2.k2);
> k1 | v1 | k2 | v2
> ------------+----+------------+----
> 2014-10-01 | AA | 2014-10-01 | A1
> 2014-10-04 | DD | 2014-10-04 | A2
> 2014-10-07 | GG | 2014-10-07 | A3
> (3 rows)
>
> dbhist=# select * from t1 left outer join t2 on (t1.k1=t2.k2);
> k1 | v1 | k2 | v2
> ------------+----+------------+----
> 2014-10-01 | AA | 2014-10-01 | A1
> 2014-10-02 | BB | |
> 2014-10-03 | CC | |
> 2014-10-04 | DD | 2014-10-04 | A2
> 2014-10-05 | EE | |
> 2014-10-06 | FF | |
> 2014-10-07 | GG | 2014-10-07 | A3
> (7 rows)
>
> ------------ (SEMI) SOLUZIONE:
>
> dbhist=# select t1.k1, t1.v1, case when t2.k2 IS NULL then (select max
> (t2.k2) from t2 where t2.k2 <= t1.k1) else t1.k1 end, t2.v2 from t1 left
> outer join t2 on (t1.k1=t2.k2);
>
> k1 | v1 | k1 | v2
> ------------+----+------------+----
> 2014-10-01 | AA | 2014-10-01 | A1
> 2014-10-02 | BB | 2014-10-01 |
> 2014-10-03 | CC | 2014-10-01 |
> 2014-10-04 | DD | 2014-10-04 | A2
> 2014-10-05 | EE | 2014-10-04 |
> 2014-10-06 | FF | 2014-10-04 |
> 2014-10-07 | GG | 2014-10-07 | A3
>

Di nuovo grazie!!
Marco aka FreCho 21 Ott 2014 12:23
On Mon, 20 Oct 2014 17:13:03 +0200, mmm wrote:


>>
>>
> Di nuovo grazie!!



di nulla
ciao

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Problematiche relative alla gestione di Database | Tutti i gruppi | it.comp.software.database | Notizie e discussioni software database | Software database Mobile | Servizio di consultazione news.