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