2017-09-18 3 views
0

J'ai une table contenant des données avec des événements, qui sont liés aux clients et montrent une séquence chronologique. Les champs pertinents sont EventID (clé unique), CustomerID (unique pour chaque client), EventType et EventDate.Obtenir l'entrée suivante chronologique dans une table

Je voudrais maintenant ajouter une colonne calculée qui afficherait si un certain événement s'est produit après un autre événement. Dites, si après un événement du type "Achat" il y avait aussi un événement du type "Paiement Reçu" pour le même customerID se produisant après le premier événement (selon EventDate).

Dans Excel, je voudrais maintenant configurer un vlookup mais pour autant que je sache, il n'y a pas une telle fonctionnalité dans PowerPivot. J'ai également essayé de diviser les tables pour obtenir l'événement pertinent via RELATED() mais comme la relation résultante est plusieurs-à-plusieurs, j'obtiens une erreur de PowerPivot.

Existe-t-il un moyen de faire cela dans PowerPivot? (Je serais également en mesure de manipuler les données dans Power Query à l'avance si cela pouvait résoudre le problème.)

EDIT: J'ai trouvé une solution à mon problème impliquant SQL. Je serais toujours intéressé par une solution directement dans PowerPivot, si cela est même possible.

Répondre

0

Une solution impliquant la transformation des données lors du chargement via SQL.

SELECT TOP 1 WITH TIES ev.* 
    ,results.EventType 
    ,results.EventDate 
    FROM CustomerEvents ev 
    LEFT JOIN (SELECT CustomerID 
     EventType 
     EventDate 
     FROM CustomerEvents 
     WHERE EventType = 'Payment received' or EV_EventCode = 'Payment not received') as payments 
    ON payments.CustomerID = ev.CustomerID 
    AND payments.EventDate > ev.EventDate 
    WHERE EventType = 'Purchase' 
    ORDER BY ROW_NUMBER() over (PARTITION BY EventID ORDER BY payments.EventDate ASC) 

Le Order By payments.EventDate Asc est si je reçois la première date de l'événement après l'événement d'achat qui obtient ensuite filtré via TOP 1 me empêchant de tri accidentellement un événement à un achat beaucoup plus tôt de paiement qu'il est destiné.