2017-02-15 2 views
0

le titre serait trop verbeux si j'ai essayé de caser tout là-dedans, mais voici ce que je besoin d'aide avec ...à redshift, comment puis-je utiliser les fonctions de la fenêtre pour attribuer un compte à une date de ligne précédente

Nous essayons de calculer la rétention des utilisateurs. Nos utilisateurs ont des dates de début et de fin d'affectation qui peuvent se chevaucher. Ce que je dois faire est de regarder toutes les affectations de candidats et de déterminer si elles sont conservées (30 jours ou moins entre la fin précédente et le nouveau départ). La partie délicate: je dois affecter le crédit de rétention à la date de fin de l'affectation précédente. Voici un aperçu des données:

month | user_id | start_date | end_date | rank | days_btw_assignment 
    1  5  1-1-16  1-31-16  1  NULL 
    2  5  2-14-16  4-15-16  2  15 
    6  4  6-01-16 11-01-16  1  NULL 
    8  4  8-01-16 11-01-16  2  -81 

Par conséquent, pour l'utilisateur 5, je aurais besoin de donner du crédit de la rétention au mois de jan-16' parce que leur date de fin de mission se termine 31/01/16. Pour l'utilisateur 4, lorsque des affectations se chevauchent, je donnerais un crédit de rétention à nov-16 'parce que leur date de fin d'affectation précédente se termine le 11-01-16.

J'ai limité cet exemple pour utiliser des cas où ils ont seulement 2 affectations, cependant, il pourrait y en avoir plus. J'ai juste besoin d'un pas dans la bonne direction et je peux probablement gérer tous les autres cas d'utilisation par moi-même.

est ici l'exemple de code que je suis actuellement en utilisant:

with placement_facts as (select date_trunc('month',assignment_start_date) as month, user_id, assignment_start_date, assignment_end_date, rank() over (partition by user_id order by assignment_start_date asc), extract(day from assignment_start_date - lag(assignment_end_date, 1) over (partition by user_id order by assignment_start_date asc)) as time_btw_placement 
from activations as ca 
join offers on ca.offer_id = offers.id 
where assignment_start_date != assignment_end_date 
order by 2,4 asc) 
select placement_facts.month, count(distinct case when time_btw_placement <=30 then user_id else null end) as retained_raw 
from placement_facts 
group by 1; 

apprécie l'aide et si je s'il vous plaît LMK nee à clarifier quoi que ce soit!

+0

Veuillez partager les données de l'échantillon et la sortie requise .. –

Répondre

0

Si je comprends votre question alors je pense que vous pouvez réaliser ce que vous voulez en remplaçant votre utilisation de LAG() par LEAD(). C'est fondamentalement la même fonction mais elle regarde un nombre donné de rangées devant.