ЗНАЧЕНИЯ в снежинке

#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 |
 ------- ----------