Получить максимальное число строк внутри перекрестного применения

У меня возникли проблемы с вычислением максимума row_number в моем случае sql.

Я объясню это непосредственно на примере SQL Fiddle, так как я думаю, что так будет быстрее понять: SQL Fiddle

  • Столбцы «OrderNumber», «HourMinute» и «Code» предназначены только для представления моей таблицы и, следовательно, не должны иметь значения для целей кодирования.
  • Столбец «DateOnly» содержит даты
  • Столбец «Телефон» содержит телефоны моих клиентов
  • Столбец «Покупки» содержит количество покупок, совершенных клиентами за последние 12 месяцев. Обратите внимание, что это значение предоставляется для каждой даты, поэтому период времени в 12 месяцев относится к дате, которую мы оцениваем.

Наконец, я пытаюсь создать столбец «ПРЕДЫДУЩИЕ ПОКУПКИ», в котором подсчитывается, сколько раз цифра, указанная в столбце «Покупки», появлялась за предыдущие 12 месяцев (для каждого телефона).

Вы можете увидеть на примере SQL Fiddle, чего я добился до сих пор. Столбец «ПРЕДЫДУЩИЕ ПОКУПКИ» выдает то, что я хочу, однако он также выдает более низкие значения (например, мне нужно только максимальное значение).

Например, вы можете видеть, что строки 4 и 5 дублируются, одна с «ПРЕДЫДУЩИМИ ПРИОБРЕТЕНИЯМИ» со значением 1, а другая со значением 2. В данном случае я не хочу иметь 4-ю строку.

Хотя я хотел заменить row_number чем-то вроде max(row_number), но я не смог его создать (уже просмотрел аналогичные сообщения в stackoverflow...).

Это должно быть реализовано в SQL Server 2012.

Заранее спасибо.


person Alfons    schedule 10.04.2013    source источник
comment
(1) Может ли Purchases быть int? (2) Неясно насчет PREVIOUSPURCHASES. Не могли бы вы опубликовать необходимый результат на основе ваших данных Fiddle?   -  person PM 77-1    schedule 10.04.2013


Ответы (1)


Я не уверен, какой набор результатов вы хотите увидеть, но что-то не так с тем, что возвращается с этим?

SELECT c.OrderNumber, c.DateOnly, c.HourMinute, c.Code, c.Phone, c.Purchases, MAX(o.PreviousPurchases)
FROM cte c CROSS APPLY (
                      SELECT t2.DateOnly, t2.Phone,t2.ordernumber, t2.Purchases, ROW_NUMBER() OVER(PARTITION BY c.DateOnly ORDER BY t2.DateOnly) AS PreviousPurchases
                      FROM CurrentCustomers_v2 t2
                      WHERE c.Phone = t2.Phone AND t2.purchases<=c.purchases AND DATEDIFF(DAY, t2.DateOnly, c.DateOnly) BETWEEN 0 AND 365
                      ) o
WHERE c.OrderNumber = o.OrderNumber
GROUP BY c.OrderNumber, c.DateOnly, c.HourMinute, c.Code, c.Phone, c.Purchases
ORDER BY c.DateOnly
person SLin    schedule 10.04.2013
comment
Спасибо, это именно то, что мне было нужно - person Alfons; 11.04.2013