#sql #snowflake-cloud-data-platform
Вопрос:
У меня есть такой столик —
n0 n1 n2
232 12 211
323 45 5655
Я хочу получить этот результат —
n Count
232 1
12 1
211 1
323 1
45 1
5655 1
Я могу сделать это, используя этот запрос в PostgreSQL.
select el, count(*)
from
(
SELECT n0, n1, n2 from npi
) n
cross join lateral
(select v.el
from (values (n0), (n1), (n2)) v(el)
) v
group by el
Но когда я пытаюсь выполнить тот же запрос в Snowflake, я получаю эту ошибку —
Invalid expression [CORRELATION(N.N0)] in VALUES clause
Ответ №1:
Четвертичная форма с использованием UNION ALL
:
WITH cte(el) AS (
SELECT n0 FROM npi
UNION ALL SELECT n1 FROM npi
UNION ALL SELECT n2 FROM npi
)
SELECT el, COUNT(*)
FROM cte
GROUP BY el;
Выход:
Редактировать:
Версия, в которой используется ВЫРАВНИВАНИЕ в сочетании с ARRAY_CONSTRUCT:
SELECT value AS el, COUNT(*)
FROM(SELECT n0, n1, n2 from npi) AS n
,TABLE(FLATTEN(input => array_construct(n.n0, n.n1, n.n2)))
GROUP BY value;
Ответ №2:
Ниже приведена версия с использованием UNPIVOT:
create or replace table test (n0 int, n1 int, n2 int);
insert into test values (232, 12, 211), (323, 45, 5655);
select value, count(1) from test
unpivot(value for col_name in (n0, n1, n2))
group by value;
------- ----------
| VALUE | COUNT(1) |
|------- ----------|
| 232 | 1 |
| 12 | 1 |
| 211 | 1 |
| 323 | 1 |
| 45 | 1 |
| 5655 | 1 |
------- ----------