-1
votes

Fonction de fenêtre SQL pour trouver des jours après

Je veux calculer DPD (jours après-vente) de la liste de prêt triés par date. Chaque date d'échéance du passé doit être recomptée. Voir exemple dans Joindre . Comment puis-je calculer la colonne "Jours antérieurs dus"?

photo DPD attacher


3 commentaires

Veuillez baliser votre question avec la base de données que vous utilisez: mysql, oracle, postgresql ...? En outre, il serait bien préférable de fournir vos données en tant que texte tabulaire plutôt que comme une image.


Veuillez baliser votre question avec la base de données que vous utilisez.


Quel est votre résultat souhaité? Pour ce prêt, le DPD serait-il 4, 6, 0 ou autre chose?


3 Réponses :


0
votes

Je lis cela en tant que serveur SQL pour une raison quelconque. Les conventies suivantes utilisent des conventions SQL Server pour les fonctions de date. D'autres bases de données ont des fonctions similaires, mais la syntaxe exacte diffère.

L'IDA clé - un maximum conditionnel cumulatif - ne change pas: P>

select t.*,
       (case when status = 'PastDue'
             then datediff(date,
                           max(case when status <> 'PastDue' then dayDate end) over (partition by loadnumer order by daydate)
             else 0
        end) as daysPastDue
from t;


0 commentaires

0
votes

Vous voulez compter les jours consécutifs de «passé dû» et réinitialiser le compteur entre les deux. C'est des lacunes et un problème de l'île.

Si les dates augmentent toujours de 1 jour, comme indiqué dans vos données d'échantillon, une méthode consiste alors à faire la différence entre la date et le code> Row_Number () code> pour définir Le groupe Chaque enregistrement appartient à. p>

Vous n'avez pas dit quelle base de données que vous utilisez, voici une méthode utilise daadd (code> daadd () code> pour faire le calcul de la date; bases de données qui ne supportent pas une fonction équivalente. p> xxx pré>

Démo sur DB Fiddle Strard>: p>

p>

loan_number | daydate    | status   | daysPastDue
----------: | :--------- | :------- | ----------:
     111111 | 2020-01-01 | Live     |           0
     111111 | 2020-01-02 | Live     |           0
     111111 | 2020-01-03 | PastDue  |           1
     111111 | 2020-01-04 | PastDue  |           2
     111111 | 2020-01-05 | Restruct |           0
     111111 | 2020-01-06 | Restruct |           0
     111111 | 2020-01-07 | Restruct |           0
     111111 | 2020-01-08 | PastDue  |           1
     111111 | 2020-01-09 | PastDue  |           2
     111111 | 2020-01-10 | Closed   |           0


0 commentaires

0
votes

Cela devrait le faire.

SELECT
t1.LoanNumber, t1.daydate, t1.Status, case 
when status = 'Past Due'
  then datediff(day, 
             (select max(daydate) from table1 t2 
                where t2.loanNumber =t1.loanNumber 
                and t2.daydate<t1.daydate and t2.status<> 'Past Due'
             ),
             daydate)
   else 0 end as [Days Past Due]
from table1 t1


0 commentaires