group后count中既包含字段(可DISTINCT去重)又包含条件过滤

本文探讨了在SQL中如何使用COUNT函数进行复杂的数据汇总,包括如何计算每个用户拥有的卡片数量及特定类型的卡片数量,并展示了如何在一个查询中同时完成这两种汇总。

分组后count中既包含字段又包含条件过滤

情景

假如用户表join另一个表后获得如下内容(每个用户可以有多个card,每个card有个card_type属性),别名为t

uidcard_typecard
11aaa
11bbb
10ccc
21ddd

常用聚合:

  1. 每个用户的card数量:
select t.uid, COUNT(t.card)	from t group by t.uid
select t.uid, COUNT(*) from t group by t.uid
  1. 每个用户card_type为1的card数量(COUNT不计null值) 。缺点:只能汇总card_type=1
select t.uid, COUNT(t.card) from t where t.card_type=1 group by t.uid
select t1.uid, COUNT(t1.card) from ( select * from t group by t.uid
) t1 group by t1.id, t1.card_type
select uid, COUNT(card_type=1 or null) from t group by uid

根据字段(可去重)和条件COUNT

每个每种card_type的card数量和所有类型card_type的card数量

此时汇总的字段为card,但是一个需要有card_type条件,一个不需要

上面汇总的方法就不适用了,就必须拆分为第1种和第2种两个sql查询。不再多说

下面列举一些单条sql的实现

select t.uid, COUNT(t.card), COUNT(if(t.card_type=1, t.card,null)) from t group by uid
select t.uid, COUNT(t.card), COUNT(CASE WHEN t.card_type=1 THEN t.card ELSE null)
from t group by uid

甚至可以对选择汇总的字段card去重计数

COUNT( DISTINCT if(t.card_type=1, t.card,null) )

转载于:https://my.oschina.net/watcher/blog/841019

### 使用 `GROUP BY` 和 `DISTINCT` 进行 在 Spark 中,`GROUP BY` 和 `DISTINCT` 都可用于实现数据集的功能,但两者的工作机制和适用场景有所不同。 #### `DISTINCT` 对于简单的复记录的需求而言,`DISTINCT` 提供了一种直观的方式。它能够直接过滤掉具有相同字段值的所有额外副本,仅保留唯一实例。语法简洁明了: ```sql SELECT DISTINCT column_name(s) FROM table_name; ``` 这种方法适合于不需要执行任何附聚合运算的情况,并且其内部实现逻辑类似于 `reduceByKey` 操作,即先局部规约再全局汇总[^5]。 #### `GROUP BY` 相比之下,`GROUP BY` 不仅仅是用于消除冗余项;它可以同时支持更复杂的统计分析任务,比如求平均数、总和等。因此,在某些情况下,即使目的是为了,如果伴随有其他计算需求,则应优先考虑使用 `GROUP BY` 来完成工作。基本语句形式如下所示: ```sql SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name; ``` 当只关注效果而不涉及更多复杂度时,通常来说,`GROUP BY` 的效率可能不如 `DISTINCT` 或者基于 `reduceByKey` 实现的方法高效[^2]。 #### 示例代码展示两种方式的区别 下面给出一段 Python 代码片段来说明这两种不同策略的具体差异: ```python from pyspark import SparkContext sc = SparkContext(appName="example") data_rdd = sc.parallelize([("apple",), ("banana",), ("apple",)]) # Using distinct to remove duplicates directly. unique_items_distinct = data_rdd.distinct().collect() print(unique_items_distinct) # Alternatively using groupBy with a dummy aggregation function. def count_elements(iterator): yield sum(1 for _ in iterator) unique_items_groupby = ( data_rdd.groupByKey() # Assuming the input is already key-value pairs like ('item', None). .mapValues(lambda x: list(count_elements(x))[0]) # Dummy operation here just as an example. .keys() .collect() ) print(unique_items_groupby) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值