【问题标题】:Count distinct multiple columns in redshift计算红移中不同的多列
【发布时间】:2019-02-27 14:33:54
【问题描述】:

我正在尝试计算在 Amazon redshift 中具有 2 列的不同组合的行。我正在使用的查询是 -

select count(distinct col1, col2)
from schemaname.tablename
where some filters

这是给我这个错误 -

亚马逊无效操作:函数计数(字符变化,大整数)不存在`

我尝试将bigint 转换为char,但没有成功。

【问题讨论】:

  • 请分享您的示例数据和预期输出
  • 有很多方法可以实现这一点。如果可以为您提供整个用例,那就太好了。所以我们可以尝试为您找到最佳方式
  • 在 Postgres 中,您可以使用 select count (distinct (col1, col2))(注意两列周围的括号)- 也许 Redshift 也允许这样做。
  • @a_horse_with_no_name,试过了。即使在列组合周围加上括号,它也不起作用

标签: sql amazon-redshift


【解决方案1】:

你可以使用子查询和计数

select count(*) from (
  select distinct col1, col2 
 from schemaname.tablename
  where some filter
) as t

【讨论】:

  • 我相信从 RedShift 的性能角度来看,这也更好。
【解决方案2】:

聚会有点晚了,但无论如何:您也可以尝试使用|| operator 连接列。它可能效率低,所以我不会在产品代码中使用它,但对于临时分析应该没问题。

select count(distinct col1 || '_' || col2)
from schemaname.tablename
where some filters

注意分隔符选择可能很重要,即 'foo' || '_' || 'bar_baz''foo_bar' || '_' || 'baz' 都产生 'foo_bar_baz' 并因此相等。在某些情况下,这可能会引起关注,在某些情况下,它是如此微不足道,您可以完全跳过分隔符。

【讨论】:

    【解决方案3】:

    你可以使用

    select col1,col2,count(*) from schemaname.tablename
    where -- your filter
    group by col1,col2
    

    【讨论】:

      【解决方案4】:

      如果您只是想做count(distinct),那么 Zaynul 的回答是正确的。如果您还想要其他聚合,这里有另一种方法:

      select . . ., 
             sum(case when seqnum = 1 then 1 else 0 end) as col1_col2_unique_count
      from (select t.*,
                   row_number() over (partition by col1, col2 order by col1) as seqnum
            from schemaname.tablename t
            where some filters
           ) c
      

      【讨论】:

        猜你喜欢
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-18
        • 2014-01-15
        • 1970-01-01
        相关资源
        最近更新 更多