【问题标题】:How to retrieve the rows in a table that has a value that appears NOT the most times?如何检索表中具有出现次数不是最多的值的行?
【发布时间】:2017-09-13 23:04:11
【问题描述】:

我有两张桌子。

customers 表和 orders 表。

customers:                          orders:
customer_id      customer_name      orders_id   customer_id
1111             Charles            1020        1111
2222             Bertram            1021        1111
3333             Barbare            1022        2222
                                    1023        3333

我希望输出是:

customer_name
Bertram
Barbara

我只想检索来自BertramBarbara 的订单,因为他们下单的次数不是最多。

这里的问题是子查询。我知道如何计算客户下订单的次数,但我很难选择出现次数最少的customer_id

使用 mySQL 和 Apache

【问题讨论】:

  • 请指定数据库引擎,例如sql server、oracle、postgresql?
  • 最少次数是相对的。与什么相比最少?如果一个客户有 100 个订单,另一个有 40 个订单,另一个有 30 个订单,另一个有 10 个订单,他们的订单数量都少于最大订单数(即 100 个),但是您需要从中选择多少个?!你需要最少订单的客户吗?!
  • 您想只获取一列 (customer_name) 吗?重要的是要知道我们是否必须对记录进行分组。
  • 哪个 SQL?每个 dbms 都有自己的做事方式。请正确标记。

标签: mysql apache


【解决方案1】:

根据您的示例数据,您可能会发现只有 1 个订单的客户,您可以使用以下查询

SELECT customer_name
  FROM customer c
  JOIN orders o
    ON c.customer_id = o.customer_id
 GROUP BY customer_name
HAVING COUNT(orders_id) = 1

结果

customer_name
Bertram
Barbara

【讨论】:

  • 正如我所说,根据样本数据,OP可能会根据他的预期计数改变条件
【解决方案2】:

由于您没有指定您正在使用的数据库,我假设您被标准 SQL 卡住了(分析函数不可用)。然后你可以依赖 ALL 运算符:

WITH count_table AS (SELECT customer_id, COUNT(*) AS num_of_orders
                     FROM your_table
                     GROUP BY customer_id)
SELECT *
FROM count_table
WHERE num_of_orders <= ALL(SELECT num_of_orders FROM count_table)

【讨论】:

    【解决方案3】:

    我会为此使用rank()

    select oc.*
    from (select o.customer_id, count(*) as cnt,
                 rank() over (order by count(*) asc) as seqnum
          from orders o
          group by o.customer_id
         ) oc
    where seqnum = 1;
    

    这不会返回名称。但是获取名称是一个简单的连接。

    【讨论】:

      【解决方案4】:

      我终于解决了!

          SELECT c.customer_id COUNT(o.order_id) "Orders"
          FROM orders o 
          INNER JOIN customers c 
          ON (o.customer_id = c.customer_id)
          GROUP BY o.customer_id
          HAVING Orders < ANY 
                              (SELECT COUNT(ord.customer_id)
                               FROM orders ord
                               GROUP BY ord.customer_id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-14
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多