【问题标题】:How shall I write max, group by, where, order by in one sql statement?如何在一个 sql 语句中编写 max、group by、where、order by?
【发布时间】:2020-12-24 01:07:02
【问题描述】:

我需要找到1996年下单最多的customerID。我写了如下语句:

SELECT count(orderID) as orderNumber
     , CustomerID
     , OrderDate  
  FROM Orders 
 where OrderDate between "1996-01-01" AND "1996-12-31" 
 group 
    by CustomerID 
 order 
    by orderNumber DESC ;

结果如下:

我的问题是我只想打印最上面的客户 ID,即 65、63、20,但我不知道怎么写。 我想我应该在这里使用 max 来过滤已经发起 6 个订单的 customerID。 我说的对吗?

【问题讨论】:

  • 您应该首先根据什么标准定义顶级cistoner,并告诉我们如何获取这些信息
  • 您的查询无效。你想显示哪个OrderDate?客户的第一个还是他们的最后一个?决定然后应用适当的功能,例如MAX(OrderDate) 或者根本不显示日期。如果您只想显示数量最多的客户,请在 ORDER BY 子句之后使用 LIMIT 1。
  • @ThorstenKettner。我的查询是有效的。我想过滤 1996 年的所有订单。订单日期与客户发起订单的日期匹配。所以一个customerId 可以有多个orderId 和orderDate。这是问题所在。有三个 customerIds 发起了相同的最大订单。如果我使用 LIMIT 1,它只返回一个 customerIds
  • 否,查询无效。客户 65 下了 6 个订单,您显示日期为 '1996-07-22'。那么,您看到它保证当天所有六个订单都下达了吗?你的桌子能保证吗? MySQL 应该在此处引发错误,并且它可能并不表示您正在运行旧版本。如前所述,要使查询有效,您必须从 select 子句中删除日期或对其应用聚合函数。

标签: mysql sql count sql-order-by window-functions


【解决方案1】:

在 MySQL 8.0 中,你可以使用rank()

select *
from (

    select count(*) as orderNumber
         , CustomerID
         , max(OrderDate) 
         , rank() over(order by count(*) desc) rn
     from Orders 
     where OrderDate >= '1996-01-01' and OrderDate < '1997-01-01'
     group by CustomerID 
) t
where rn = 1

注意事项:

  • select 子句中的OrderDate 需要一个聚合函数,因为它不属于group by 子句

  • 如果您的日期有时间分量,则半开区间优于 between

  • 对文字字符串使用单引号而不是双引号

【讨论】:

    【解决方案2】:

    在版本 8 之前的 MySQL 版本中,您必须进行两次计数。例如:

    select 
      count(orderid) as number_of_orders,
      customerid,
      group_concat(orderdate order by orderdate) as order_dates
    from orders 
    where orderdate between date '1996-01-01' and date '1996-12-31'
    group by customerid 
    having number_of_orders =
    (
      select max(number_of_orders)
      from
      (
        select count(orderid) as number_of_orders
        from orders 
        where orderdate between date '1996-01-01' and date '1996-12-31'
        group by customerid 
      ) counted
    )
    order by customerid;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      相关资源
      最近更新 更多