J'ai une table redshift avec parmi d'autres choses un ID code> et
plan_type CODE> Colonne et aimerait une clause de groupe de fonctions de fenêtre où le
plan_type code> change de sorte que si ceci est la donnée par exemple:
SELECT * FROM
(
SELECT
user_id,
plan_type,
created_at,
lag(plan_type) OVER (PARTITION by user_id ORDER BY created_at) as prev_plan,
row_number() OVER (PARTITION by user_id ORDER BY created_at) as rownum
FROM tablename
WHERE plan_type IS NOT NULL
) userHistory
WHERE
userHistory.plan_type <> userHistory.prev_plan
OR userHistory.rownum = 1
ORDER BY created_at;
3 Réponses :
Utiliser Row_Number () code> Fonction de fenêtre
select * from
(select *,row_number()over(partition by user_id,plan_type order by created) rn
) a where a.rn=1
Ceci est un problème de lacunes et de îles. Je pense que Ceci suppose que les types de plan peuvent revenir à une autre valeur et que vous voulez chacun. p> Si non, utilisez simplement l'agrégation: P> lag () code> est l'approche la plus simple:
select user_id, plan_type, min(created)
from t
group by user_id, plan_type;
Merci c'est génial. Cependant, étant donné que j'ai des ordures dans les données où la valeur est parfois nulle entre-temps, je devais modifier le lieu où les conditions sont un peu mais que votre solution est globalement exactement ce dont j'avais besoin! Merci!
Utiliser lag () code>
La dernière date est-elle une erreur?