Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery 在BigQuery中对行内的列进行排序_Google Bigquery - Fatal编程技术网

Google bigquery 在BigQuery中对行内的列进行排序

Google bigquery 在BigQuery中对行内的列进行排序,google-bigquery,Google Bigquery,我有下面这样的桌子 id a b c 1 2 1 3 2 3 2 1 3 16 14 15 4 10 12 13 5 15 16 14 6 10 12 8 我需要通过对a、b、c列中的值进行排序来“规范化”该表—逐行进行排序,并对重复数据进行重复计数 预期结果 a b c dups 1 2 3 2 14 15 16 2 10

我有下面这样的桌子

id  a   b   c    
1   2   1   3    
2   3   2   1    
3   16  14  15   
4   10  12  13   
5   15  16  14   
6   10  12  8    
我需要通过对a、b、c列中的值进行排序来“规范化”该表—逐行进行排序,并对重复数据进行重复计数

预期结果

a   b   c   dups     
1   2   3   2    
14  15  16  2    
10  12  13  1    
8   10  12  1    
我确实有解决方案,但当我有3个以上的列需要规范化时,我不知道如何轻松地“扩展”它。您可以在下面看到的第一列和最后一列不是问题。当列数>3</P>时,中间的列变得杂乱。
select a, b, c, count(1) as dups from (
select a1 as a, if(a != a1 and a != c1, a, if(b != a1 and b != c1, b, c)) as b, c1 as c
from (select a, b, c, least(a, b, c) as a1, greatest(a, b, c) as c1 from table)
) group by a, b, c

有人能推荐另一种方法吗?

下面的示例适用于4列,可以通过在CONCAT()中添加额外的字符串(x)和在每个额外的列中为REGEXP_EXRACT添加额外的行来调整为任意数量的列

SELECT a, b, c, d, COUNT(1) AS dups 
FROM (
  SELECT id,  
    REGEXP_EXTRACT(s + ',', r'(?U)^(?:.*,){0}(.*),') AS a, 
    REGEXP_EXTRACT(s + ',', r'(?U)^(?:.*,){1}(.*),') AS b, 
    REGEXP_EXTRACT(s + ',', r'(?U)^(?:.*,){2}(.*),') AS c, 
    REGEXP_EXTRACT(s + ',', r'(?U)^(?:.*,){3}(.*),') AS d
  FROM (
    SELECT id, GROUP_CONCAT(s) AS s FROM (
      SELECT id, s, 
        INTEGER(s) AS e, 
        ROW_NUMBER() OVER(PARTITION BY id ORDER BY e) pos
      FROM (
        SELECT id,  
          SPLIT(CONCAT(STRING(a),',',STRING(b),',',STRING(c),',',STRING(d))) AS s 
        FROM table
      ) ORDER BY id, pos
    ) GROUP BY id
  )
) GROUP BY a, b, c, d