【问题标题】:redshift select distinct returns repeated valuesredshift select distinct 返回重复值
【发布时间】:2015-12-28 19:37:52
【问题描述】:

我有一个数据库,其中每个对象属性都存储在单独的行中。附加的查询不会在 redshift 数据库中返回不同的值,但在任何 mysql 兼容数据库中进行测试时会按预期工作。

SELECT DISTINCT distinct_value 
FROM
( 
  SELECT
    uri,
    ( SELECT DISTINCT value_string 
      FROM `test_organization__app__testsegment` AS X 
      WHERE X.uri = parent.uri AND name = 'hasTestString' AND parent.value_string IS NOT NULL ) AS distinct_value 
  FROM `test_organization__app__testsegment` AS parent 
  WHERE     
    uri IN ( SELECT uri 
             FROM `test_organization__app__testsegment` 
             WHERE name = 'types' AND value_uri_multivalue = 'Document'
           )
) AS T 
WHERE distinct_value IS NOT NULL
ORDER BY distinct_value ASC
LIMIT 10000 OFFSET 0

【问题讨论】:

  • 也许值看起来相同,但间距或字符集存在细微差别。
  • 你能提供一个示例输出吗?我建议通过简化查询(例如删除条件和嵌套查询)来调查原因,直到DISTINCT 按预期工作。这可能会导致该行为的原因。
  • 可能是 MySQL 数据库不区分大小写,而 Redshift 是。试试 lower(distinct_value) 看看是否可行。
  • 感谢您的反馈,我今天回到了这个问题,它似乎是红移中的一个错误。我将使用模式、数据和示例查询来报告它。虽然上面的查询返回重复值,但用 COUNT 包装它并删除 order/limit/offset 元素会返回不同值的正确计数 - 真的很奇怪。 .知道 redshift 与 postgresql 部分兼容后,我对本地 postgresql 实例进行了相同的测试,结果很好。
  • 截至 2017 年 3 月,这似乎仍然是 RedShift 中的一个错误。我在作为表的主键的整数字段上尝试了 SELECT DISTINCT,它带回了重复项。在某些表上它可以正常工作,但在其他表上 DISTINCT 根本不起作用,所以我不得不求助于 GROUP BY。

标签: sql amazon-redshift


【解决方案1】:

这不是一个错误,行为是故意的,虽然不是直截了当的。

在 Redshift 中,您可以在表上声明约束,但 Redshift 不会强制执行它们,即如果您插入重复值,它允许重复值。这里唯一的区别是,当您对没有声明主键的列运行 SELECT DISTINCT 查询时,它将扫描整个列并获取唯一值,如果您在具有主键约束的列上运行相同的值它只会返回输出而不执行唯一列表过滤。这就是插入重复条目的方法。

为什么要这样做? Redshift 针对大型数据集进行了优化,如果您不需要检查复制或插入的每一行的约束有效性,复制数据的速度会更快。如果您愿意,您可以将主键约束声明为数据模型的一部分,但您需要通过删除重复项或以没有这样的方式设计 ETL 来明确支持它。

此堆博客文章Redshift Pitfalls And How To Avoid Them中的具体示例的更多信息

【讨论】:

  • 也许我误解了你的回答,但我认为问题是关于响应中的重复数据,而不是主键在 Redshift 中不强制唯一性的事实
  • @KevinPostlewaite 响应中出现重复数据,因为当列上设置了主键时,Redshift 假定数据是唯一的,并且在查询 distinct 时不执行唯一过滤。重复数据如何位于主列中?因为 RS 不强制执行约束。这很奇怪,但这就是它的工作原理。
  • 一些支持@AlexYes'回答的文档:docs.aws.amazon.com/redshift/latest/dg/…
  • @AlexYes 抱歉,我确实误解了你的回答 :-)
【解决方案2】:

也许您可以通过使用适当的连接来解决这个问题。 例如,我在表 1 中有重复的值,我希望通过将表 1 的值加入表 2,并且根据您的条件加入两个表背后有一些逻辑。

所以我可以做这样的事情!

select distinct table1.col1 from table1 left outer join table2 on table1.col1 = table2.col1

这对我很有效,我从 table1 获得了独特的价值,可以删除重复项

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多