Oracle 运行SELECT DISTINCT后,仍会显示重复项

Oracle 运行SELECT DISTINCT后,仍会显示重复项,oracle,select,duplicates,distinct,Oracle,Select,Duplicates,Distinct,运行SELECT DISTINCT后,尽管使用了所有适当的技术来确保重复的行是真正重复的(将trim应用于所有字段,将日期字段格式化为仅日期等),我仍然在结果中看到重复。我甚至尝试了分组方式,但在运行之后,仍然出现了重复项。有人知道世界上正在发生什么事吗?有人知道我能做什么吗 SELECT DISTINCT ID, Address_Line_1, Address_Line_2, City, State, Zip, to_date(START_DATE, 'DD-MON-YYY

运行
SELECT DISTINCT
后,尽管使用了所有适当的技术来确保重复的行是真正重复的(将trim应用于所有字段,将日期字段格式化为仅日期等),我仍然在结果中看到重复。我甚至尝试了
分组方式
,但在运行之后,仍然出现了重复项。有人知道世界上正在发生什么事吗?有人知道我能做什么吗

SELECT DISTINCT 
    ID, Address_Line_1, Address_Line_2, City, State, Zip, 
    to_date(START_DATE, 'DD-MON-YYYY') as START_DATE, 
    to_date(END_DATE, 'DD-MON-YYYY') as END_DATE 
FROM 
    AddressHistory
ORDER BY 
    ID, START_DATE DESC;

这是因为列
START\u DATE
END\u DATE
中的时间因素不相同,如果您像下面这样编写查询,则应该将其区分开来

SELECT DISTINCT * FROM
(
    SELECT  ID, Address_Line_1, Address_Line_2, City, State, Zip, to_date(START_DATE, 'DD-MON-YYYY') as START_DATE, to_date(END_DATE, 'DD-MON-YYYY') as END_DATE

    FROM AddressHistory
)T

ORDER BY ID, START_DATE desc; 
试一试

这会截断日期的时间,并且比类型转换更快


在您的示例中,起始日期是什么数据类型?也许你可以完全摆脱类型转换?

昨天你发布同样的问题时,你试过我的建议吗?我没有看到TRUNC应用于您在这个问题中查询的日期。显然,假设“日期”确实是数据类型,为什么要对它们应用“日期”?TO_DATE应应用于字符串,以将其转换为日期。提供测试用例:创建表并插入多个样本行(“E 3RD ST”就足够了),这样我们就可以看到您真正拥有的内容、查询返回的内容以及原因。列start_DATE和end_DATE的数据类型是什么?如果它们是日期类型,则使用TRUNC-不要对已经是日期的值使用TO_DATE。如果它们是字符串数据类型,那么您可能会有“01-Jan-2020”和“01-Jan-2020”等值,这是一个不应将日期/时间值存储为字符串的另一个示例。如果您
从表
中选择dump(column_name),您将确切地看到二进制输出中每个列/表达式的计算结果以及差异所在。如果没有一个可复制的例子,我的猜测是其中一个日期在一个世纪内,而不是您预期的日期(即,一个日期在2013年,另一个日期在1913年或0013年)。但这只是一个猜测,没有更多的信息。@mathguy,当我做Trunc(开始日期)时,我得到了以下错误。这是因为在某些记录中存在空值,所以当它遇到空值时会抛出错误。这就是为什么我尝试了其他方法,但我明白你的意思。ORA-01722:无效号码01722。00000-“无效数字”*原因:指定的数字无效*措施:指定一个有效数字。此答案是错误的(尽管已经有一票赞成)。错误,因为在OP的查询中应用了TO_DATE,如果它不抛出错误,将导致日期中的时间成分等于午夜。似乎在某些字段周围使用修剪(以删除隐藏字符)和trunc(TO_DATE(START_DATE,'DD-MON-YYYY')作为START_DATE方法的组合解决了问题
SELECT DISTINCT 
     ID, Address_Line_1, Address_Line_2, City, State, Zip, 
     trunc(to_date(START_DATE, 'DD-MON-YYYY')) as START_DATE, 
     trunc(to_date(END_DATE, 'DD-MON-YYYY')) as END_DATE  FROM 
AddressHistory 
ORDER BY ID, START_DATE DESC;