【问题标题】:How to select max spending customer per month如何选择每月最大支出客户
【发布时间】:2015-10-30 05:15:47
【问题描述】:

我有一个列出日期、customerID、orderID 和 orderCost 的视图。 如何选择每月最大消费客户? 数据仅跨越 2015 年的六个月。

我能够获得每个客户每月花费的 SUM,但不能获得客户的最大支出:

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

*其中 CustomerPricedOrder 是从名为 CustomerOrder 的表中获取数据的视图

如何使用存储过程找到每月最大支出客户? 我需要一个光标吗?

调用过程时需要的输出示例:

  • 年........月............客户ID
  • 2015........一月.......4
  • 2015........2月......21
  • 2015........三月............6
  • 2015........4........11

其中 customerID 是该月支出最高的客户。

【问题讨论】:

标签: mysql sql


【解决方案1】:

你可以按总和降序并限制 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;

【讨论】:

  • order by sum_of_order_cost 会给你一个无效的标识符错误。
【解决方案2】:
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

这可能有效

【讨论】:

    【解决方案3】:

    亚历克斯,

    你可以试试这个

    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;
    

    如果我的大脑理解正确,这应该可以完成这项工作。

    【讨论】:

      【解决方案4】:

      试试这个....

      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;
      

      【讨论】:

        【解决方案5】:

        似乎是分析函数的直接应用

            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() 将为相同结果分配相同的订单号),或者您需要添加到排序条件在解析函数中。

        【讨论】:

          【解决方案6】:

          这是一种使用变量来模拟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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-20
            • 2021-10-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多