首页 > 解决方案 > 连接三个表中的三列,然后将第一列中的不同值按第三列中的最大值分组

问题描述

我将三张表合二为一,得到下表:

客户名称 国家的名字 客户数
客户 1 阿尔巴尼亚 1
客户 1 波斯尼亚 22
客户 1 克罗地亚 2
客户 1 德国 2
客户 1 英国 1
客户 1 马其顿 4
客户 1 黑山 3
客户 1 塞尔维亚 4502
客户 1 火鸡 1
客户 2 比利时 921
客户 2 英国 3
客户 2 马耳他 3
客户 2 罗马尼亚 7
客户 2 瑞典 1
客户 3 拉脱维亚 1
客户 3 立陶宛 1848年
客户 4 意大利 143
客户 5 阿尔巴尼亚 1
客户 5 阿尔及利亚 4
客户 5 亚美尼亚 4
客户 5 奥地利 3
客户 5 阿塞拜疆 1
客户 5 比利时 5746

我加入这三个表的查询如下所示:

SELECT c1.client_name, c2.country_name, count(c3.customer_id) AS num_customers
FROM 
clients c1
LEFT JOIN countries c2 ON c1.fk_country = c2.country_id
LEFT JOIN customers c3 ON c1.fk_customer = c3.customer_id
GROUP BY c1.client_name, c2.country_name;

现在!我需要扩展此查询,以便我的表仅包含每个客户的国家/地区以及最大客户数。所以决赛桌应该是这样的:

客户名称 国家的名字 客户数
客户 1 塞尔维亚 4502
客户 2 比利时 921
客户 3 立陶宛 1848年
客户 4 意大利 143
客户 5 比利时 5746

我尝试添加有子句或交叉连接 max(num_customers) 但只能返回一行。请帮忙?!

标签: mysqlsql

解决方案


您可以使用窗口函数:

SELECT client_name, country_name, num_customers
FROM (SELECT c1.client_name, c2.country_name, COUNT(*) AS num_customers,
             ROW_NUMBER() OVER (PARTITION BY c1.client_name ORDER BY COUNT(*) DESC) as seqnum
      FROM clients c1 JOIN
           countries c2
           ON c1.fk_country = c2.country_id JOIN
           customers c3
           ON c1.fk_customer = c3.customer_id
      GROUP BY c1.client_name, c2.country_name
     ) ccc
WHERE seqnum = 1;

注意:我将连接切换为内部连接,假设所有客户端都有一个国家/地区。也许您在Bar Tawil有客户。

是一个显示语法有效的 db<>fiddle。


推荐阅读