sql 去重计数函数
时间: 2025-05-22 15:46:53 浏览: 19
### SQL 去重计数的函数或方法
在 SQL 查询中,`DISTINCT` 是一种常用的去重方式,通常与 `COUNT()` 结合使用来统计唯一值的数量。以下是几种常见的实现方式及其解释。
#### 方法 1: 使用 `COUNT(DISTINCT column)`
这是最常见的去重计数方法之一,适用于单列或多列的去重统计。通过指定要统计的列名并应用 `DISTINCT` 关键字,可以确保只计算唯一的记录数量[^1]。
```sql
SELECT COUNT(DISTINCT user_id) AS unique_users
FROM credit_dc_project_count;
```
此查询将返回表 `credit_dc_project_count` 中不同用户的总数。
---
#### 方法 2: 使用 `GROUP BY` 配合 `COUNT()`
另一种去重的方式是利用 `GROUP BY` 对特定字段进行分组,然后再对每一组内的数据执行 `COUNT()` 统计操作。这种方法适合于需要按某个维度(如分类、日期等)分别统计的情况[^5]。
```sql
SELECT user_sources, COUNT(user_id) AS total_users
FROM credit_dc_project_count
WHERE user_sources IN ('wodong', 'qq')
GROUP BY user_sources;
```
该查询按照 `user_sources` 字段分组,并统计每个来源下的用户总数。
---
#### 方法 3: 条件去重计数
当需要基于某些条件筛选后再做去重计数时,可以通过嵌套 `CASE` 表达式配合 `COUNT(DISTINCT ...)` 实现复杂逻辑[^2]。
```sql
SELECT
COUNT(DISTINCT CASE WHEN count_type IN (1, 4) THEN user_id END) AS type_1_and_4,
COUNT(DISTINCT CASE WHEN count_type IN (2, 5) THEN user_id END) AS type_2_and_5
FROM credit_dc_project_count;
```
这段代码展示了如何根据不同类型的业务场景(由 `count_type` 定义),分别统计对应的唯一用户数。
---
#### 方法 4: 复杂解码与多重过滤
对于更复杂的业务需求,可能涉及多个字段之间的关联关系处理。此时可借助数据库中的 `DECODE` 或类似的条件判断功能完成进一步细化的操作[^3]。
```sql
SELECT
COUNT(DISTINCT a.c_fundacco) AS f_sumcount,
COUNT(DISTINCT DECODE(b.c_custtype, '0', a.c_fundacco, NULL)) AS f_orgcount,
COUNT(DISTINCT DECODE(b.c_custtype, '1', a.c_fundacco, NULL)) AS f_percount
FROM tshares a
JOIN tclientinfo b ON a.c_clientinfoid = b.c_clientinfoid;
```
这里不仅实现了基础的去重计数,还加入了客户类型 (`c_custtype`) 的区分逻辑,从而能够单独统计机构和个人两类主体的数据量。
---
#### 方法 5: 利用窗口函数扩展能力
虽然传统意义上的 `COUNT(DISTINCT ...)` 已经非常强大,但在高级分析场景下,还可以考虑引入窗口函数(Window Functions)。这些工具允许我们在保留原始行的同时,动态地计算分区范围内的汇总指标[^4]。
例如:
```sql
SELECT
user_id,
COUNT(*) OVER (PARTITION BY user_id) AS per_user_total_actions
FROM credit_dc_project_count;
```
这条语句会在保持原表格结构不变的前提下,额外附加一列显示每位用户的行为次数分布情况。
---
### 性能对比注意事项
尽管两种主要技术路线都能满足基本的功能诉求,但从性能角度来看却存在差异。一般来说,在大规模数据集上运行时,`GROUP BY` 可能比单纯依赖 `DISTINCT` 更高效一些;然而具体表现仍取决于实际硬件环境以及索引设计等因素的影响[^5]。
---
阅读全文
相关推荐


















