sql - 如何提取值作为 MAX 出现的出现次数?
问题描述
我有一个汇总表如下
user_id service no_of_trx
1 A 56
1 C 43
1 B 22
2 C 10
2 A 3
3 B 45
3 C 7
4 A 77
4 B 63
它总结了 user_id 使用过的所有不同类型的服务,并按他们为每个服务进行的事务数排序。如何提取每个服务作为顶级服务出现的次数?预期成绩
service occurrence_as_max
A 2
B 1
C 1
因为服务 A 是用户 1 和 4 的顶级服务,服务 B 和 C 分别是用户 3 和 2 的顶级服务。
到目前为止我所拥有的:
WITH a as
(SELECT user_id, service, count(service) no_of_trx
FROM transactions
GROUP BY user_id, service
ORDER BY no_of_trx desc),
b as
(SELECT distinct(user_id) user, max(no_of_trx) occurrence_as_max
FROM a
GROUP BY user_id
ORDER by user)
SELECT distinct(service), b.occurrence_as_max
FROM b
LEFT JOIN a ON a.user_id=b.user.
ORDER by b.occurrence_as_max desc;
但这显然行不通。
解决方案
以下脚本应该可以工作。这是标准查询语法。您可能需要在 BigQuery 中进行一些调整,但逻辑应该没问题。
SELECT A.service, COUNT(*)
FROM your_table A
INNER JOIN
(
SELECT user_id, MAX(no_of_trx) no_of_trx
FROM your_table
GROUP BY user_id
)B ON A.user_id = B.user_id
AND A.no_of_trx = B.no_of_trx
GROUP BY A.service
推荐阅读
- c# - 如何解决错误:“找不到类型或命名空间名称 'BITMAPFILEHEADER'”?
- php - Jquery Fileuploader 上 mysql 选择查询的附加条件
- algorithm - 如何压缩一定范围内的随机正整数数组?
- database-design - 在多个轴上聚合时间序列数据?
- android - 如何使我的“列表视图”中的每个添加项目,可点击并可以打开一个新活动
- c# - 有效检查 DataTable 中的任何单元格是否包含子字符串
- javascript - 在浅拷贝/克隆上更新 eventListener
- jboss - 配置为 JCache 时如何从 Infinispan 缓存中获取高级缓存或配置事务管理器?
- ionic-framework - 如何在离子输入旁边对齐离子段 - Ionic4
- python - 有没有办法复制一个目录的内容(仅文件)而不遍历该目录中的所有文件?