Sympathique :-)
Jean-Paul Argudo/ = 16 Septembre, 2006 - 12:19
Voici une solution à ce sympathique problème que j'ai trouvée. Tout réside sur un coalesce(): cette fonction prends le 1er élément non nul.
J'utilise ainsi une jointure externe entre les deux table pour trouver les nuls (éléments de T2 n'existant pas dans T1), et les traiter.
select t1.a, (t1.b *
coalesce(
-- B existe dans la table T2
t2.b,
-- B n'existe pas dans la table T2
-- on prends l'élément le plus petit de T2
-- correspondant
(select tt2.b
from table2 tt2
where tt2.a < t1.a
order by tt2.a desc
limit 1),
-- B de T2 n'existe pas et de plus, la date est
-- la plus petite de T2
(select ttt2.b
from table2 ttt2
order by ttt2.a
limit 1)
)
) as resultat
from table1 t1
left join table2 t2 using (a);
a | resultat
------------+----------
2000-01-01 | 1000
2000-01-02 | 1100
2000-01-03 | 1200
2000-01-04 | 13000
2000-01-05 | 14000
2000-01-06 | 15000
2000-01-07 | 160000
(7 lignes)
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
Merge Left Join (cost=406.03..1213747.81 rows=18818 width=12) (actual time=0.279..0.587 rows=7 loops=1)
Merge Cond: ("outer".a = "inner".a)
InitPlan
-> Limit (cost=135.34..135.34 rows=1 width=8) (actual time=0.056..0.060 rows=1 loops=1)
-> Sort (cost=135.34..140.19 rows=1940 width=8) (actual time=0.047..0.047 rows=1 loops=1)
Sort Key: a
-> Seq Scan on table2 ttt2 (cost=0.00..29.40 rows=1940 width=8) (actual time=0.006..0.021 rows=3 loops=1)
-> Sort (cost=135.34..140.19 rows=1940 width=8) (actual time=0.097..0.131 rows=7 loops=1)
Sort Key: t1.a
-> Seq Scan on table1 t1 (cost=0.00..29.40 rows=1940 width=8) (actual time=0.011..0.046 rows=7 loops=1)
-> Sort (cost=135.34..140.19 rows=1940 width=8) (actual time=0.051..0.066 rows=3 loops=1)
Sort Key: t2.a
-> Seq Scan on table2 t2 (cost=0.00..29.40 rows=1940 width=8) (actual time=0.007..0.023 rows=3 loops=1)
SubPlan
-> Limit (cost=64.46..64.46 rows=1 width=8) (actual time=0.042..0.045 rows=1 loops=4)
-> Sort (cost=64.46..66.07 rows=647 width=8) (actual time=0.032..0.032 rows=1 loops=4)
Sort Key: a
-> Seq Scan on table2 tt2 (cost=0.00..34.25 rows=647 width=8) (actual time=0.007..0.013 rows=1 loops=4)
Filter: (a < $0)
Total runtime: 0.714 ms
(20 lignes)
erkkk
En espérant que cela vous sera utile :-)
Cordialement,
--
Jean-Paul ARGUDO
www.dalibo.com
[ Vous devez
vous connecter pour poster des commentaires ]