select distinct 去重保留
时间: 2023-09-09 19:06:52 浏览: 180
distinct 关键字用于查询结果去重,它会保留去重后的唯一值。如果你希望保留其中的某些数据,可以使用聚合函数(如 SUM、AVG、MAX、MIN 等)来对其进行计算并保留。另外,还可以使用子查询、联结等方式对数据进行筛选和组合。需要注意的是,在使用 distinct 时,查询的性能可能会受到影响,因此需要根据实际情况进行权衡。
相关问题
DISTINCT 去重求和
### 如何在 SQL 查询中使用 `DISTINCT` 去重后再进行 `SUM` 求和
为了实现先去重再求和的功能,在 SQL 中可以采用子查询的方式。具体来说,可以在内层查询中通过 `SELECT DISTINCT` 来消除重复项,然后再在外层查询中应用聚合函数如 `SUM()` 对这些唯一值做加总。
下面给出一个具体的例子来展示这一过程:
假设有一个名为 `sales` 的销售记录表,其中包含字段 `product_id`, `sale_amount` 和其他一些列。如果想要计算每种产品不考虑多次购买情况下的总销售额,则可按照如下方式构建查询语句:
```sql
-- 计算不同 product_id 下 sale_amount 总额
SELECT SUM(sale_amount) as total_sales
FROM (
SELECT DISTINCT product_id, sale_amount
FROM sales
) t;
```
此方法确保了对于每一个 `product_id` 只会选取一次对应的 `sale_amount` 进行累加操作[^1]。
另外一种场景是在更复杂的环境中处理多列组合的情况,比如当存在多个维度需要同时考虑时。此时同样可以通过嵌套查询的形式完成任务。例如给定的数据集中有月份 (`mth`)、客户编号(`s_kh`)以及交易金额(`s_sdje`)三个重要属性,目标是按月统计去除重复客户的消费总额:
```sql
-- 统计每个月份下去除重复后的客户消费总额
SELECT mth, SUM(je) AS je, COUNT(DISTINCT s_kh) sl
FROM (
SELECT DATE_FORMAT(fi.ts_createtime,'%m') mth,
fi.s_sdje,
CASE
WHEN (fi.s_kh IS NULL OR fi.s_kh='') AND (fi.s_zh IS NOT NULL AND fi.s_zh<>'')
THEN fi.s_zh
ELSE fi.s_kh
END s_kh
FROM spp_fb_freeze_info fi
LEFT JOIN spp_req_basic_info bi ON fi.s_bizid=bi.s_id
WHERE fi.c_zxjg='0'
AND bi.c_qqcslx IN('05','06')
AND bi.c_biztype='40'
AND YEAR(bi.ts_createtime)=2023
) b
GROUP BY mth;
```
上述代码片段展示了如何在一个较为复杂的情况下利用 `CASE` 结构调整某些特定条件下使用的键值,并最终实现了基于时间周期内的汇总分析功能[^2]。
#### 使用 PostgreSQL 实现相同逻辑
考虑到不同的数据库管理系统可能具有略微差异化的语法支持,在 PostgreSQL 数据库环境下执行类似的查询也可以遵循相同的思路。这里提供了一个简单的实例用于说明如何针对用户得分表(users)中的分数(score),依据队伍(team)来进行去重并求和的操作:
```sql
CREATE TABLE users(
id SERIAL PRIMARY KEY,
player VARCHAR(255) NOT NULL,
score REAL,
team VARCHAR(255)
);
INSERT INTO users(player,score,team) VALUES
('库里',28.3,'勇士'),
('哈登',30.2,'火箭'),
('阿杜',25.6,'勇士'),
('阿詹',27.8,'骑士'),
('神龟',31.3,'雷霆'),
('白边',19.8,'热火');
-- 针对 teams 列进行分组并对 scores 应用 distinct 后求和
SELECT team, SUM(DISTINCT score) as unique_score_sum
FROM users
GROUP BY team;
```
这段脚本首先定义了一张存储球员信息及其所属球队成绩的表格,接着插入了几条测试数据;最后部分则完成了根据队伍名称分组的同时只保留各队成员间互异的成绩数值之和的任务[^4]。
distinct 去重取最新时间
在数据库查询中,为了避免数据的重复,常常需要对数据去重,只保留其中的最新数据。这就需要使用 DISTINCT 关键词来实现去重,并且同时还要进行最新时间的筛选。DISTINCT是 SQL 语言中的一种关键词,用于检索表中不重复的数据。
而对于取最新时间,一般采用的方法是将数据按照时间降序排列,然后选择第一条即为最新数据。通常情况下,我们可以使用 SELECT 语句来实现这个功能,同时在语句中引入 DISTINCT 和 GROUP BY 或者 ORDER BY 语句。
例如,假设有一个商品表 product,其中包含了商品名称、价格、时间等信息,我们需要对其进行去重,并且只保留最新的一条数据。可以使用以下语句来实现:
SELECT DISTINCT name, price, MAX(time) AS latest_time FROM product GROUP BY name, price;
以上语句将按照商品名称和价格进行分组,并且取出每组中最新的时间,然后通过 DISTINCT 关键词来实现去重,只保留每组中的一条数据。
需要注意的是,在使用 DISTINCT 关键词时,如果查询语句中有其他的列,并且这些列的数据值不同,那么这些数据也会被视为不同的数据,不会被去重。因此,一定要注意在使用 DISTINCT 关键词时,要同时考虑到数据去重和最新时间筛选的因素。通过合理地使用查询语句和关键词,可以化繁为简地实现数据的去重和选择最新数据的功能。
阅读全文