【问题标题】:Count distinct letters in a string in bigquery在 bigquery 中计算字符串中的不同字母
【发布时间】:2021-08-04 14:37:46
【问题描述】:

我在 Biquery 中有一个字符串列,例如:

select 'A' 
union all (select 'ab')
union all (select 'abc')
union all (select 'aa')
union all (select 'aab')

我想计算列的每一行中不同字符的数量,在这种情况下,结果将是:

1
2
3
1
2

这可以在 BigQuery 中完成吗?怎么样?

【问题讨论】:

标签: sql google-bigquery


【解决方案1】:

这个怎么样(假设你不想区分大小写)...

WITH data AS (select 'A' AS `val`
              union all (select 'ab')
              union all (select 'abc')
              union all (select 'aa')
              union all (select 'aab'))
SELECT `val`, 26 - LENGTH(REGEXP_REPLACE('abcdefghijklmnopqrstuvwxyz', '['||LOWER(`val`)||']', ''))
FROM `data`;

【讨论】:

  • 如果您需要区分大小写或0-9,只需更新源正则表达式字符串和该字符串的长度即可。 SELECT val, 52- LENGTH(REGEXP_REPLACE('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '['||val||']', ''))
【解决方案2】:

一种简单的方法是使用SPLIT 将您的字符串转换为数组,并使用UNNEST 将结果数组转换为表格。然后您可以使用COUNTDISTINCT 来确定唯一字符的数量,如下所示:

with my_data AS (
   select 'A' as col
union all (select 'ab')
union all (select 'abc')
union all (select 'aa')
union all (select 'aab')
)

select col, (SELECT COUNT(*) FROM (
  SELECT DISTINCT element FROM UNNEST(SPLIT(col,'')) as element
)) n from my_data;

或者干脆

WITH my_data AS (
   SELECT 'A' as col UNION ALL 
   SELECT 'ab'       UNION ALL 
   SELECT 'abc'      UNION ALL 
   SELECT 'aa'       UNION ALL 
   SELECT 'aab'
)
SELECT 
    col, 
    (
        SELECT 
            COUNT(DISTINCT element) 
        FROM 
            UNNEST(SPLIT(col,'')) as element
    ) cnt 
FROM 
    my_data;

【讨论】:

    【解决方案3】:

    与之前一样,但使用 COUNTDISTINCT

    with my_data AS (
    select 'A' as col
    union all (select 'ab')
    union all (select 'abc')
    union all (select 'aa')
    union all (select 'aab')
    )
    
    select col, COUNT(DISTINCT element) FROM 
    my_data,UNNEST(SPLIT(col,'')) as element
    GROUP BY col
    

    【讨论】:

      【解决方案4】:

      如果数据不是很大,我宁愿使用user-defined functions 来简化跨不同列的字符串操作

      CREATE TEMP FUNCTION
        get_unique_char_count(x STRING)
        RETURNS INT64
        LANGUAGE js AS r"""
          str_split = new Set(x.split(""));
          return str_split.size;
        """;
      WITH
        result AS (
        SELECT
          'A' AS val
        UNION ALL (
          SELECT
            'ab')
        UNION ALL (
          SELECT
            'abc')
        UNION ALL (
          SELECT
            'aa')
        UNION ALL (
          SELECT
            'aab') )
      SELECT
        val,
        get_unique_char_count(val) unique_char_count
      FROM
        result
      

      结果:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-24
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        相关资源
        最近更新 更多