通过最小订单1查找最年轻的客户

时间:2019-05-05 03:41:00

标签: mysql sql analytical

我需要写一个查询来找到购买至少1种产品的最小客户

以下是数据: 客户:

enter image description here

ORDER_DETAIL:

enter image description here

这是我到目前为止的查询:

SELECT c.CUSTOMERID, c.age, c.name
from (
SELECT CUSTOMERID, COUNT(ORDERID) as "totalOrder"
FROM FACEBOOK_ORDER_DETAIL
GROUP BY CUSTOMERID 
HAVING COUNT(ORDERID) >=1) AS tbl
LEFT JOIN FACEBOOK_CUSTOMER c on c.CUSTOMERID = tbl.CUSTOMERID
order by c.age ;

但是,以上查询给了我enter image description here

但是我需要年龄最小的客户列表。

2 个答案:

答案 0 :(得分:1)

如果您真的只想要一个最小的客户,即使有关系,也可以使用LIMIT

SELECT c.CUSTOMERID, c.age, c.name
FROM CUSTOMER c
INNER JOIN FACEBOOK_ORDER_DETAIL o
    ON c.CUSTOMERID = c.CUSTOMERID
ORDER BY
    c.age
LIMIT 1;

这应该起作用,因为如果客户加入订单明细表,则表明他至少有一个订单。

如果您想查找所有个最年轻的客户,包括所有关系,那么一种很好的解决方法是使用RANK分析函数:

SELECT DISTINCT CUSTOMERID, age, name
FROM
(
    SELECT c.CUSTOMERID, c.age, c.name, RANK() OVER (ORDER BY c.age) rnk
    FROM CUSTOMER c
    INNER JOIN FACEBOOK_ORDER_DETAIL o
        ON c.CUSTOMERID = o.CUSTOMERID
) t
WHERE rnk = 1;

Demo

对于早期版本的MySQL,我们可以使用子查询作为一种解决方法来避免出现RANK

SELECT DISTINCT c.CUSTOMERID, c.age, c.name
FROM CUSTOMER c
INNER JOIN FACEBOOK_ORDER_DETAIL o
    ON c.CUSTOMERID = c.CUSTOMERID
WHERE c.age = (SELECT MIN(t1.age)
               FROM CUSTOMER t1
               INNER JOIN FACEBOOK_ORDER_DETAIL t2
                   ON t1.CUSTOMERID = t2.CUSTOMERID);

Demo

答案 1 :(得分:1)

您只需要customers中的列,因此我将其表达为:

select c.*
from (select c.*,
             rank() over (order by age) as seqnum
      from customers c
      where exists (select 1
                    from facebook_order_detail fod
                    where fod.customerid = c.customerid
                   )
    ) c
where seqnum = 1;

尤其是,这不需要重复的消除或聚合,因此它应该更快。而且它可以在face_book_details(customerid)上使用索引,也可以在customers(age, customerid)上使用索引。