【问题标题】:After running SELECT DISTINCT, duplicates still show运行 SELECT DISTINCT 后,仍然显示重复项
【发布时间】:2021-04-09 23:10:10
【问题描述】:

在运行SELECT DISTINCT 后,我仍然在我的结果中看到重复项,尽管我使用了所有适当的技术来确保重复的行确实是重复的(将修剪应用于所有字段,将日期字段格式化为仅日期等)。我什至尝试过GROUP BY,但运行它后,仍然出现重复项。有没有人知道世界上正在发生什么,以及我能做些什么?

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;

【问题讨论】:

  • 您是否尝试了我昨天发布相同问题时的建议?在这个问题中,我没有看到 TRUNC 应用于您查询中的日期。从此,假设“日期”确实是数据类型,为什么要对它们应用 TO_DATE? TO_DATE 应应用于 字符串,以将它们转换为日期。
  • 提供测试用例:CREATE TABLE 和 INSERT INTO 几个示例行(“E 3RD ST”就足够了),以便我们了解您真正拥有什么以及您的查询返回什么以及原因。跨度>
  • start_date 和 end_date 列的数据类型是什么?如果它们是 DATE 类型,则使用 TRUNC - 切勿对已经是 DATE 的值使用 TO_DATE。如果它们是字符串数据类型,那么您可能有“01-JAN-2020”和“01-JAN-2020”之类的值,以及另一个示例为什么永远不应将日期/时间值存储为字符串。
  • 如果您select dump(column_name) from table,您将确切地看到每列/表达式在二进制输出中的计算结果以及差异所在。如果没有可重现的示例,我的猜测是其中一个日期与您预期的日期不同(即一个日期是 2013 年,另一个是 1913 年或 0013 年)。但这只是猜测,没有更多信息。
  • @mathguy,当我执行 Trunc(Start_Date) 时,出现以下错误。这是因为某些记录中有空值,所以遇到空值时会抛出错误。这就是我尝试其他方法的原因,但我明白你在说什么 ORA-01722:无效号码 01722。00000 - “无效号码” *原因:指定的号码无效。 *操作:指定一个有效的数字。

标签: oracle select duplicates distinct


【解决方案1】:

这是因为您的列START_DATEEND_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; 

【讨论】:

  • 这个答案是错误的(尽管已经投了一个赞成票)。错误,因为 TO_DATE 的应用在 OP 的查询中,如果它没有抛出错误,它将导致日期的时间部分等于午夜。
【解决方案2】:

试试

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;

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

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

【讨论】:

  • 似乎在某些字段周围使用 Trim(以删除隐藏字符)和 trunc(to_date(START_DATE, 'DD-MON-YYYY')) 作为 START_DATE 方法的组合解决了问题跨度>
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2018-06-28
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多