0

0

SQLite:利用GROUP BY实现多列组合去重及关联数据查询

霞舞

霞舞

发布时间:2025-07-11 13:00:14

|

920人浏览过

|

来源于php中文网

原创

SQLite:利用GROUP BY实现多列组合去重及关联数据查询

本文旨在解决SQLite数据库中,如何基于多个列的组合进行去重,并为每个独特的组合获取其关联的特定数据。针对直接使用DISTINCT无法满足此需求的场景,文章详细阐述了利用GROUP BY子句结合聚合函数(如MIN或MAX)来实现这一目标的方法。通过实例代码,读者将理解如何高效地从数据库中提取每组唯一的组合及其对应的单条关联记录,从而避免数据重复并优化查询逻辑。

1. 问题背景与挑战

在数据库查询中,我们经常需要根据一个或多个列的值来识别唯一的记录。当需求仅仅是获取这些唯一的列组合时,distinct关键字通常能满足要求。例如,select distinct branch, section, year from users; 将返回所有不重复的 branch, section, year 组合。

然而,当我们需要在获取这些唯一组合的同时,还希望关联性地返回该组合对应的其他列(例如,每个唯一组合中的一个 admission_number 和 password),仅仅使用 DISTINCT 关键字就显得力不从心。直接尝试 SELECT admission_number, password, DISTINCT(branch, year, section, p1_p2) FROM users; 会导致语法错误,因为 DISTINCT 关键字通常应用于所有选定的列,或者作为聚合函数的一部分(例如 COUNT(DISTINCT column))。

实际需求是,对于数据库中每一组独特的 branch, section, year, p1_p2 组合,我们只需要获取其中一条记录的 admission_number 和 password。这类似于以下伪代码逻辑:

seen_combinations = set() # 用于存储已处理的唯一组合
results = []
for record in users_table:
    branch, section, year, p1_p2 = record.branch, record.section, record.year, record.p1_p2
    admission_number, password = record.admission_number, record.password

    current_combination = (branch, section, year, p1_p2)
    if current_combination not in seen_combinations:
        seen_combinations.add(current_combination)
        results.append((admission_number, password)) # 将该组合对应的 admission_number 和 password 添加到结果中
# 最终 results 包含每种唯一组合对应的 admission_number 和 password

2. 解决方案:利用 GROUP BY 和聚合函数

要解决上述问题,SQL中更强大且适用于此场景的机制是 GROUP BY 子句结合聚合函数。

GROUP BY 子句用于将具有相同值的行分组到汇总行中。当与聚合函数(如 MIN(), MAX(), AVG(), COUNT(), SUM() 等)一起使用时,它会为每个组返回一个汇总值。

核心思想:

魔珐星云
魔珐星云

无需昂贵GPU,一键解锁超写实/二次元等多风格3D数字人,跨端适配千万级并发的具身智能平台。

下载
  1. 使用 GROUP BY 子句指定需要去重并形成唯一组合的列 (branch, section, year, p1_p2)。这将把所有具有相同这些列值的行归为一组。
  2. 对于那些不在 GROUP BY 子句中,但又希望在结果中出现的列 (admission_number, password),必须使用聚合函数对其进行处理。由于我们只需要从每个组中任意选择一个 admission_number 和 password,MIN() 或 MAX() 是最简单且常用的选择。它们会从每个组中分别选出 admission_number 和 password 的最小值或最大值。

示例 SQL 查询:

SELECT
    branch,
    section,
    year,
    p1_p2,
    MIN(admission_number) AS admission_number,
    MIN(password) AS password
FROM
    users
GROUP BY
    branch,
    section,
    year,
    p1_p2;

代码解析:

  • SELECT branch, section, year, p1_p2: 这些是构成唯一组合的列,它们直接从 GROUP BY 后的组中获取其唯一值。
  • MIN(admission_number) AS admission_number, MIN(password) AS password: 对于 admission_number 和 password 这两个列,它们不在 GROUP BY 子句中。因此,我们使用 MIN() 聚合函数。MIN() 会从每个分组中选择 admission_number 和 password 列的最小(按字典序)值。AS admission_number 和 AS password 是别名,用于使输出列名更清晰。
  • FROM users: 指定查询的表。
  • GROUP BY branch, section, year, p1_p2: 这是关键部分。它告诉数据库根据 branch, section, year, p1_p2 这四个列的组合来分组所有行。所有这四个列值都相同的行将被视为一个组。

通过这种方式,数据库会遍历 users 表,识别所有独特的 (branch, section, year, p1_p2) 组合。对于每个组合,它会从该组合包含的所有原始行中,选择一个 admission_number 的最小值和一个 password 的最小值,并将它们作为结果输出。

3. 注意事项与进阶考虑

  • 聚合函数的选择: 在本例中,MIN() 或 MAX() 的选择是任意的,因为需求是获取“任何一个”关联的 admission_number 和 password。如果对选择哪一个有特定要求(例如,需要最新插入的、或者某个特定条件的),则需要更复杂的逻辑,如使用窗口函数(ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...))。
  • 性能优化: 对于大型 users 表,在 GROUP BY 子句中使用的列 (branch, section, year, p1_p2) 上创建复合索引可以显著提高查询性能。例如:
    CREATE INDEX idx_users_unique_combo ON users (branch, section, year, p1_p2);
  • 数据一致性: 这种方法假设对于同一个 (branch, section, year, p1_p2) 组合,其对应的 admission_number 和 password 在功能上是等价的,或者选择其中任意一个都是可接受的。如果 admission_number 和 password 在不同的行中对于相同的组合可能具有不同的含义,那么简单地使用 MIN() 或 MAX() 可能无法满足精确的业务需求。在这种情况下,需要重新评估业务逻辑或使用更复杂的查询(例如,先通过子查询或CTE找到每个组合的“主”记录ID,然后连接回主表)。

总结

当需要在SQL中实现基于多列组合的去重,并同时获取这些唯一组合所关联的其他数据时,GROUP BY 子句是比单纯使用 DISTINCT 更强大和灵活的解决方案。通过将需要去重的列放入 GROUP BY,并对其他需要返回的列使用聚合函数(如 MIN() 或 MAX()),我们可以高效地从数据库中提取出每组独特的组合及其对应的单条关联记录,从而满足复杂的查询需求。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

678

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

572

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 11.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

NumPy 教程
NumPy 教程

共44课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号