mysql - 连接三个表中的三列,然后将第一列中的不同值按第三列中的最大值分组
问题描述
我将三张表合二为一,得到下表:
客户名称 | 国家的名字 | 客户数 |
---|---|---|
客户 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) 但只能返回一行。请帮忙?!
解决方案
您可以使用窗口函数:
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。
推荐阅读
- java - Java lambda 元工厂
- c# - List<> 到 MemoryStream 的转换
- javascript - 如何在 angular 中访问 http 响应中的嵌套数组和对象
- c - 对于扫雷网格布局,一些地雷打印为 0
- python - 使用python在文件中合并具有相同键值对的json对象
- sonarqube - Bitbucket 的声纳失败,缺少“组件”参数
- sql - 波斯语全文索引停止列表
- rest - API 设计:如何处理第三方的 API 错误
- react-native - react-native-mapbox-gl 在发布模式下时应用程序崩溃
- python - 它们是一种内置方法,可直接用于使用 python-gitlab 通过名称搜索 gitlab 存储库吗