2017-09-13 51 views
2

我有两张桌子。如何检索具有不是最多次数的值的表中的行?

A 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

+2

请指定db引擎,例如SQL服务器,甲骨文,PostgreSQL的? – gordy

+2

最少的时间是相对的。最少比较什么?如果一个客户有100个订单,另一个有40个,另一个有30个,另一个有10个,他们都少于最大订单数量(100个),但您需要选择多少?你需要订单数量最少的顾客吗?! –

+0

你想获取一列('customer_name')吗?知道如果我们必须对记录进行分组很重要。 – 2017-09-13 23:21:01

回答

0

,你可能会发现客户只需一个顺序,你可以使用下面的查询

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 
+0

正如我所说,根据样本数据,OP可能会根据他的预期计数数量来更改条件 –

+0

您有权利。我没有阅读文字。我的错。 – 2017-09-13 23:26:42

+0

不用担心@aendeerei –

0

由于您没有指定您正在使用的数据库,我假设您被标准SQL卡住(分析函数不可用)。然后,你可以依靠的所有操作:

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) 
0

我会用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; 

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

0

我终于解决了!

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) 
相关问题