2015-10-30 3 views
6

У меня есть представление, в котором указаны дата, идентификатор клиента, orderID и orderCost. Как выбрать максимальное количество клиентов в месяц? данные только охватывает период в шесть месяцев в 2015 годуКак выбрать максимальный расход клиента в месяц

Я могу получить суммы, потраченной каждого клиента каждый месяц, но не максимальный расходы клиента с:

SELECT EXTRACT(YEAR FROM date) AS year, MONTHNAME(date) AS month, customerID, SUM(orderCost) 
FROM CustomerPricedOrder 
GROUP BY MONTH(date), customerID; 

*, где CustomerPricedOrder является представление, которое берет данные из таблицы под названием CustomerOrder

Как я могу найти максимальное количество клиентов в месяц с помощью хранимой процедуры? Мне нужен курсор?

Пример вывода я требую, когда я вызываю процедуру:

  • год ........ месяц ......... CUSTOMERID
  • 2015 ... ..... Январь ....... 4
  • 2015 ........ февраль ...... 21
  • 2015 ........ March ... ...... 6
  • 2015 ........ апрель ......... 11

, где customerID является самым высоким покупателем в этом месяце.

+1

Это хорошо известная проблема, см. Тег http://stackoverflow.com/questions/tagged/greatest-n-per-group –

ответ

0

Алекс,

Можете ли вы попробовать это

SELECT EXTRACT(YEAR FROM date) AS year, MONTHNAME(date) AS month, customerID, SUM(orderCost) AS cost 
FROM CustomerPricedOrder 
GROUP BY MONTH(date), customerID ORDER BY cost DESC; 

Если мой мозг правильно понял это должен делать эту работу.

3

Можете ли вы просто заказать сумму по убыванию и ограничить 1?

SELECT EXTRACT(YEAR FROM date) AS year, MONTHNAME(date) AS month, customerID, SUM(orderCost) as sum_of_order_cost FROM CustomerPricedOrder GROUP BY MONTH(date), customerID order by sum_of_order_cost desc limit 1; 
+0

'order by sum_of_order_cost' даст вам неверную ошибку идентификатора. – brenners1302

0

Вот способ использования переменных для моделирования row_number(). Запрос занимает каждому клиенту в группе (где каждая группа представляет месяц), начиная с 1 для самого высокого расходов клиента, и сохраняет те, с 1-го ранга:

SELECT * FROM (
    SELECT @rn := if(@prevMonth = month AND @prevYear = year, @rn + 1, 1) rn, 
      @prevMonth := month, @prevYear := year, * 
    FROM ( 
     SELECT YEAR(date) AS year, 
      MONTHNAME(date) AS month, 
      customerID, 
      SUM(orderCost) AS sum_order_cost 
     FROM CustomerPricedOrder 
     GROUP BY MONTHNAME(date), YEAR(date), customerID 
    ) t ORDER BY year, month, sum_order_cost desc 
) t WHERE rn = 1 
0

попробовать это ....

SELECT EXTRACT(YEAR FROM date) AS year, 
MONTHNAME(date) AS month, 
customerID, 
SUM(orderCost) as sum_of_order_cost, 
MAX(sum_of_order_cost) FROM CustomerPricedOrder 
GROUP BY MONTH(date), customerID 
order by orderCost; 
+1

@ Александр, год это должно сработать, попробовать –

1
SELECT EXTRACT(YEAR FROM date) AS year, 
MONTHNAME(date) AS month, 
customerID, 
SUM(orderCost) as sum_order_cost, 
MAX(sum_of_order_cost) FROM CustomerPricedOrder 
GROUP BY MONTH(date), customerID 
order by sum_order_cost DESC 
LIMIT 1 

Это может работать

0

Кажется, прямо вперед применения аналитических функций

select year, month, customer, amount, 
    rank() OVER (PARTITION BY year, month ORDER BY amount DESC) rn 
    (
      SELECT EXTRACT(YEAR FROM date) AS year, MONTHNAME(date) AS month,customerID, SUM(orderCost) amount 
      FROM CustomerPricedOrder 
      GROUP BY MONTH(date), customerID 
    ) 

; 

Это будет оценивать сумму в год/месяц с максимальной назначенной суммой rn -> 1. Общий вопрос, который вам нужно знать при использовании аналитических функций, - это то, как вы хотите иметь дело с «равными результатами» (т. Е. Два клиента с одинаковой суммой за период). Проверьте, нужно ли обрабатывать этот случай и подходит ли Row_Number к вашим потребностям (заставляет уникальную нумерацию даже для равных результатов, тогда как rank() присваивает одинаковый номер заказа для равных результатов), или вам нужно добавить критерии сортировки в аналитическая функция.

Смежные вопросы