у меня есть Payment
таблицу, которая выглядит немного как это:SQL Server без использования петель
Id (int identity)
CustomerId (int)
PaymentDate (SmallDateTime)
Теперь я хочу написать запрос, который будет найти тех клиентов, которые сделали три платежа в течение трех месяцы. Учитывая следующие данные:
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
Я хотел бы, чтобы произвести следующий результат:
CustomerId LastPaymentDateInPeriod
-------------------------------------
1 2010-03-01
2 2010-07-01
Где LastPaymentDateInPeriod
является PaymentDate
с наибольшим значением в течение трех месяцев. Если для данного клиента существует более одного трехмесячного периода, ему нужно будет вернуть наибольшее значение с самого последнего периода (это то, что я попытался проиллюстрировать для клиента 2 в приведенном выше примере). Примечание, что три платежа в течение трех последовательных дней также отвечают критериям. Платежи должны пройти в течение трех месяцев.
Я знаю, как это сделать с помощью курсора и множества небольших запросов, но это медленно (и я понял, это должно быть только крайним средством). Итак, любой из вас, гениев SqlServer, знает, как это сделать с запросом?
Заранее спасибо.
Они не должны быть в 3-х отдельных месяцев? 3 платежа в течение 3 последовательных дней отвечали бы критериям? –
@ Мартин, да 3 последовательных дня также отвечают критериям. –
Если даты были 'Jan-31, Feb-28, Apr-3', то в течение 3 месяцев? 'Jan-31 + 3m = Apr-30' – RichardTheKiwi