如何从查询中删除重复值
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);
您将数据按schoolno
、schoolyear
和classId
分区并按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" 有区别吗? 列名包含大写字母时使用“”。以上是关于如何从查询中删除重复值的主要内容,如果未能解决你的问题,请参考以下文章
如何更改我的 sql 查询,以便删除列中具有某些值的行 [重复]