2017-03-03 3 views
0

Für jeden site_id Ich muß feststellen, ob die plan_id war 1 in der Vergangenheit und (Vergangenheit ein geringere id bedeutet) vor, dass nicht 1 an einem gewissen Punkt war, zum Beispiel:Wie mache ich diese Abfrage in Redshift?

create table billing (id int, site_id int, plan_id int); 

insert into billing values 
(40301, 1, 1), (40302, 1, 16), (40304, 1, 15), 
(40401, 2, 1), (40402, 2, 16), (40403, 2, 1), (40404, 2, 15); 

zurückkehren sollen:

site_id = 1, did_return = false 
site_id = 2, did_return = true 

Die Anzahl der billing Aufzeichnungen für einen bestimmten site_id könnte 1 oder Dutzende sein.

Ich habe versucht, verschachtelte Abfragen:

select (
    select (
     select id from billing where plan_id <> 1 and id < b2.id order by id desc limit 1 
    ) 
    from billing b2 where plan_id = 1 and id < b1.id order by id desc limit 1 
) 
from billing b1 
order by id desc limit 1 

Aber Redshift nicht über diese Art der Abfrage unterstützen:

ERROR: This type of correlated subquery pattern is not supported due to internal error 

Gibt es eine andere Möglichkeit, dies zu tun? Redshift ähnelt Postgres, daher gibt es wahrscheinlich auch eine Postgres-Antwort.

Antwort

1

fand ich die Lösung mit verbindet:

select b1.site_id, min(b3.id) 
from billing b1 
left join billing b2 on (b2.id < b1.id and b1.site_id = b2.site_id and b2.plan_id = 1) 
left join billing b3 on (b3.id < b2.id and b2.site_id = b3.site_id and b3.plan_id <> 1) 
group by b1.site_id 
Verwandte Themen