J'ai une table Payment
qui ressemble un peu à ceci:requête SQL Server sans utiliser des boucles
Id (int identity)
CustomerId (int)
PaymentDate (SmallDateTime)
Maintenant, je veux écrire une requête qui trouveront les clients qui ont fait trois paiements dans un délai de trois mois. Étant donné les données suivantes:
Id CustomerId PaymentDate (YYYY-MM-DD)
------------------------------------------
1 1 2010-01-01
2 1 2010-02-01
3 1 2010-03-01
4 1 2010-06-01
5 2 2010-04-01
6 2 2010-05-01
7 2 2010-06-01
8 2 2010-07-01
Je voudrais produire le résultat suivant:
CustomerId LastPaymentDateInPeriod
-------------------------------------
1 2010-03-01
2 2010-07-01
Où LastPaymentDateInPeriod
est le PaymentDate
avec la valeur la plus élevée dans un délai de trois mois. S'il y a plus d'une période de trois mois pour un client donné, il devra retourner la valeur la plus élevée de la période la plus récente (c'est ce que j'ai essayé d'illustrer pour le client 2 dans l'exemple ci-dessus). Notez que trois paiements sur trois jours consécutifs répondraient également aux critères. Les paiements doivent simplement tomber dans une période de trois mois.
Je sais comment faire cela avec un curseur et beaucoup de petites requêtes mais c'est lent (et, j'ai compris, cela ne devrait être qu'un dernier recours). Alors, est-ce que l'un de vos génies SqlServer sait comment faire cela avec une requête?
Merci d'avance.
Ils ne doivent pas être séparés en 3 mois? 3 paiements sur 3 jours consécutifs répondraient aux critères? –
@Martin, oui 3 jours consécutifs répondraient également aux critères. –
Si les dates étaient «Jan-31, Feb-28, Apr-3», est-ce dans un délai de 3 mois? 'Jan-31 + 3m = Apr-30' – RichardTheKiwi