SQL查询:筛选GROUP、DATE匹配且LANGUAGE不同的数据记录
SQL多条件筛选实现方案
需求说明
筛选同时满足GROUP、DATE两个字段值匹配,且LANGUAGE字段值不相同的记录。排除两类不符合要求的记录:
- 仅
DATE匹配但GROUP不匹配的记录 GROUP、DATE、LANGUAGE三个字段值全部相同的记录
示例表数据
| NAME | GROUP | DATE | LANGUAGE |
|---|---|---|---|
| Anne | 3 | 1/1/21 | en |
| John | 3 | 2/4/21 | en |
| Kyle | 2 | 1/1/21 | es |
| Jake | 3 | 3/8/21 | es |
| Stacy | 1 | 5/9/21 | fr |
| Mike | 2 | 3/3/21 | fr |
| Paul | 2 | 1/1/21 | fr |
| Brian | 1 | 5/9/21 | en |
| Mark | 3 | 1/1/21 | en |
期望输出
| NAME | GROUP | DATE | LANGUAGE |
|---|---|---|---|
| Kyle | 2 | 1/1/21 | es |
| Paul | 2 | 1/1/21 | fr |
| Stacy | 1 | 5/9/21 | fr |
| Brian | 1 | 5/9/21 | en |
实现SQL
方案1:窗口函数实现(兼容性好,适配MySQL 8.0+/PostgreSQL/Spark SQL等主流引擎)
注意GROUP是SQL保留关键字,需要用反引号转义:
WITH group_lang_stat AS ( SELECT *, COUNT(DISTINCT LANGUAGE) OVER (PARTITION BY `GROUP`, DATE) AS distinct_lang_cnt FROM 替换为你的表名 ) SELECT NAME, `GROUP`, DATE, LANGUAGE FROM group_lang_stat WHERE distinct_lang_cnt >= 2;
逻辑说明:先按GROUP和DATE分组统计每个分组下不同语言的数量,仅返回语言数量≥2的分组内的所有记录,自动排除不符合要求的记录。
方案2:EXISTS关联实现(兼容低版本MySQL等不支持窗口函数的引擎)
SELECT t1.NAME, t1.`GROUP`, t1.DATE, t1.LANGUAGE FROM 替换为你的表名 t1 WHERE EXISTS ( SELECT 1 FROM 替换为你的表名 t2 WHERE t2.`GROUP` = t1.`GROUP` AND t2.DATE = t1.DATE AND t2.LANGUAGE != t1.LANGUAGE );
逻辑说明:对每条记录校验是否存在同GROUP同DATE但不同语言的其他记录,存在则保留该记录。
内容的提问来源于stack exchange,提问作者Kanyon
相关产品推荐
相关产品推荐

