0
votes

SQL récupère la première occurrence dans un calendrier

Je souhaite récupérer uniquement la toute première transaction datée de processus pour chaque identifiant de l'utilisateur dans ce cadre de temps désigné qui se trouvait dans une année de 1 an de l'achat_date.

de ce que nous avons: p> xxx pré>

ceci: p> xxx pré>

Ce que je veux, est-il limité à cela comme celles-ci Vous trouverez ci-dessous les seules transactions de la liste qui ont eu la date de processus de leurs transactions dans un délai d'un an de la date d'achat et ont été d'abord parmi ces transactions, même s'il y en avait un autre pour le même utilisateur dans ce cadre, c'est-à-dire exclure tout et tout ce qui ne fait pas Ajustez ces critères: P>

User ID     Transaction Purchase Date   Process Date
ZZ1316567   41004401606 10/4/2018       1/9/2019
SS1456449   51004292754 3/24/2017       6/7/2017


7 commentaires

Votre logique ne peut pas retourner plusieurs lignes pour un seul utilisateur.


La logique initiale fait en raison de l'ID de transaction unique


. . Quelles que soient les autres colonnes, row_number () ne doit renvoyer qu'une valeur "1" pour chaque user_id .


Tu as raison, j'ai vérifié ma requête réelle ... j'ai aussi corrigé ma question :)


commander par process_date


Note latérale - Je suis sûr que distinct est rendu inutile par où l'unicité = 1 .


J'ai édité la question initiale pour donner plus de perspectives. J'espère que cela aide toutes les réponses potentielles


3 Réponses :


0
votes

vous pouvez faire avec rang_number aussi xxx


1 commentaires

Cela ne renvoie pas que la toute première transaction datée de processus pour chaque identifiant de l'utilisateur dans ce cadre de temps désigné qui se trouvait dans une année de 1 an de l'achat_date



0
votes

Dans les cas où vous voulez seulement que les premiers enregistrements «N» soient retournés, l'application extérieure () est très agréable. Cette syntaxe est T-SQL:

select distinct
    t.UserID,
    x.[Transaction],
    t.PurchaseDate,
    x.ProcessDate

from
    Table1 t
    outer apply
        (select top 1
            [Transaction],
            t1.ProcessDate
        from
            Table1 t1 
        where
            t1.UserID = t.UserID
            and datediff(day, t1.PurchaseDate, t1.ProcessDate) <= 365
            and t1.PurchaseDate between DATEADD(YEAR,-4,GetDate()) and getdate()
        order by t1.ProcessDate
            ) x
where
    x.[Transaction] is not null
;


0 commentaires

0
votes

Vous pouvez utiliser ci-dessous la requête pour obtenir les informations.

  • Nous appliquons une partition par UserID -> Pour obtenir au niveau UserID
  • Nous appliquons l'ordre de deux clauses:

    • daturant (année, acheté, processdate) = garantit que moins d'un an est commandé d'abord

    • daturant (jour, acheté, processdate) = garantit que moins de jours sont commandés d'abord xxx


1 commentaires

Merci pour vos efforts et cela ressemblait à ce serait la bonne réponse. Cependant, j'ai le même problème dans lequel il s'agit de dates de processus supérieures à 1 an, à l'exception de la date d'achat au cours des 5 dernières années. Il est cependant satisfaisant à la condition de tirer une seule ligne par acheteur. Quelque chose d'autre que vous pouvez penser?