Есть ли способ привести группу столбцов к одному и тому же типу NUMBER (p, s), чтобы они могли быть UNPIVOT в Snowflake SQL? - PullRequest
0 голосов
/ 29 октября 2019

У меня в таблице несколько числовых столбцов с разными NUMBER(p,s) типами. Таблица была создана с CREATE TABLE xx as (select date, SUM(x), SUM(y) from xxx GROUP BY date). Похоже, что снежинка определила минимум NUMBER(precision, scale), необходимый для хранения каждого результирующего столбца. Это приводит к различным типам для каждого столбца.

Теперь я хочу ОТКЛЮЧИТЬ эти столбцы, и Снежинка будет жаловаться, что SQL compilation error: The type of column 'xxxxx' conflicts with the type of other columns in the UNPIVOT list

Я создаю эту небольшую минимальную таблицу, чтобы проиллюстрировать проблему:

create or replace temporary table temp1(id number, sales number(10,0), n_orders number(20,0)) as (
    select * from (values
           (1, 1, 2 )
           ,(2, 3, 4)
           ,(3, 5, 6)
    ) 
); -- imagine that temp1 was created via a select AGG1, AGG2 FROM XXX GROUP BY YYY

describe table temp1;
-- 
name    type    kind    null?   default primary key unique key  check   expression  comment
ID  NUMBER(38,0)    COLUMN  Y       N   N           
SALES   NUMBER(10,0)    COLUMN  Y       N   N           
N_ORDERS    NUMBER(20,0)    COLUMN  Y       N   N           

select * 
from temp1 UNPIVOT(measure_value for measure_name in (sales, n_orders)); -- won't work because SALES is NUMBER(10,0) and N_ORDERS is NUMBER(20,0)

Прямо сейчас мойОбходной путь заключается в приведении каждого столбца к явному TO_NUMBER(x, 38,0) as x, например, так:

with t1 as (
  select 
    id
    ,TO_NUMBER(sales,38,0) as sales
    ,TO_NUMBER(n_orders, 38,0) as n_orders
  from temp1
)
select * from t1 UNPIVOT(measure_value for measure_name in (sales, n_orders));

Это менее чем оптимально, поскольку в реальной таблице, которую я использую, много столбцов.

Я не хочу воссоздавать таблицу (агрегирование занимает много времени), так какие у меня варианты?

Есть ли другой синтаксис, который я могу использовать для массового приведения списка столбцов?

1 Ответ

0 голосов
/ 29 октября 2019

Лучший вариант - изменить уже созданную таблицу (без необходимости повторного запуска дорогостоящей агрегации) следующим образом:

alter table temp1 modify
  sales set data type number(38,0)
  ,n_orders set data type number(38,0)
;

Таким образом, у вас есть два преимущества:

  1. выне вводите имя столбца дважды для каждого столбца: column_name set data type number(38,) вместо TO_NUMBER(column_name, 38,0) as column_name
  2. Он запускается только один раз, вместо того, чтобы запускаться как CTE перед каждым запросом UNPIVOT.
...