如何从查询中删除重复值

Posted

技术标签:

【中文标题】如何从查询中删除重复值【英文标题】:How to remove duplicate values from a query 【发布时间】:2021-11-09 20:50:57 【问题描述】:

我有以下问题,我需要从我查询的特定列中删除重复值。不删除!(ClassID)

SchoolNo Schoolyear Schoolgrade Classname ClassId
65432 2001 5 ab 441
65432 2001 5 cd 442
65432 2001 6 a 443
65432 2001 6 b 444
56838 2001 5 ab 445
56838 2001 5 cd 446
56838 2001 6 ab 445
56838 2001 6 ef 447
12726 2001 5 ms 448
12726 2001 6 ms 448

如果您查看 classId 的值,我会重复班级编号,因为一些特殊学校有时会将两个班级放在两个年级。问题是我的查询只需要显示 1 个分类值。没有重复。因此,我们可以删除任何值重复且仅在 5 年级显示的额外类。

换句话说,我的桌子最终应该是这样的。

SchoolNo Schoolyear Schoolgrade Classname ClassId
65432 2001 5 ab 441
65432 2001 5 cd 442
65432 2001 6 a 443
65432 2001 6 b 444
56838 2001 5 ab 445
56838 2001 5 cd 446
56838 2001 6 ef 447
12726 2001 5 ms 448

代码一般是这样的。

select schoolno,schoolyear,schoolgrade,classname,classId
from classgroup cg

我应该如何处理这个问题?

【问题讨论】:

【参考方案1】:

也许你可以这样做:

select
  first_value(schoolno) over w,
  first_value(schoolyear) over w,
  first_value(schoolgrade) over w,
  first_value(classname) over w,
  first_value(classId) over w
FROM
  classgroup
WINDOW w AS (PARTITION BY schoolno, schoolyear, classId ORDER BY schoolgrade);

您将数据按schoolnoschoolyearclassId 分区并按schoolgrade 排序,然后只取每个分区的第一行。

注意:语法可能有点不对,因为我无法测试它

【讨论】:

我对您的查询进行了测试,没问题。不错的方法。 我已经尝试过了,但我得到了相同的结果......它没有删除类似 classID 的第二行重复的 classid 显示两次。【参考方案2】:

试试这个

select cg1.* from classgroup cg1
left join classgroup cg2 on (cg1."ClassId"=cg2."ClassId" and cg1."Schoolgrade"<cg2."Schoolgrade")
where cg2."Schoolgrade" is null

输出:

【讨论】:

嘿,所以您的查询在重复 classid 不重复自己的情况下有效。然而,即使逻辑听起来不错,我也得到了 5 a 6 而不是 5 a 6。有没有办法应用案例陈述来强制它? 你的方法很完美。快速提问“”是什么意思? cg2.schoolgrade 和 scg."schoolgrade" 有区别吗? 列名包含大写字母时使用“”。

以上是关于如何从查询中删除重复值的主要内容,如果未能解决你的问题,请参考以下文章

如何从表中删除重复值 [重复]

如何在 MySQL 的单个列中删除重复的逗号分隔值

如何更改我的 sql 查询,以便删除列中具有某些值的行 [重复]

SQLserver数据库中所有字段全部一样的重复数据如何删除?

连接多个表后如何从sql查询结果中删除重复记录

如何从Android中的arraylist中删除重复值[重复]