Использование ROW () для вложенной структуры данных

Здесь приведена пересмотренная версия ответа @Tayrn, которая может помочь вам понять, что немного упростить:

Это может быть не лучший способ сделать это, но это помогло мне обернуть голову как сворачивать таблицы.

ID = строки, которые вы хотите свернуть

MY_KEY = столбец, который вы выбираете из исходной таблицы, которая содержит имена столбцов, которые вы хотите развернуть.

VAL = значение, которое вы хотите возвращать под каждым столбцом.

MAX (VAL) => Может быть заменен другими вспомогательными функциями. SUM (VAL), MIN (VAL), ETC ...

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(MY_KEY) 
                from yt
                group by MY_KEY
                order by MY_KEY ASC
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')
set @query = 'SELECT ID,' + @cols + ' from 
         (
            select ID, MY_KEY, VAL 
            from yt
        ) x
        pivot 
        (
            sum(VAL)
            for MY_KEY in (' + @cols + ')
        ) p '

        execute(@query);
1
задан BenoitParis 16 January 2019 в 19:39
поделиться

1 ответ

После дальнейших раскопок я пришел к следующему результату: вам просто нужно красиво поговорить с ROW ().

Это будет работать:

INSERT INTO outputTable
SELECT ROW(col1, col2) 
FROM (
  SELECT 
    col1, 
    ROW(col1, col1) as col2 
  FROM inputTable
) tbl2

Примечание:

  • Вложение: Возможно, SQL допускает только один уровень вложения. Но вам разрешено несколько табличных выражений. Я полагаю, что в данный момент Flink мало что делает для преобразования семантики SQL, прежде чем передать ее в механизм исполнения. План выполнения создаст объединенную строку (col1, ROW (col1, col1)) в одном блоке, так что это не так эффективно.
  • ROW (col1, col1): ROW (col1) во вторичной таблице не будет работать. (это будет работать автономно в первой таблице). Не знаю почему. Но эй, мне действительно нужно это, когда у меня есть только одно значение? Я могу свернуть это одно значение. Если у вас есть некоторая свобода действий в выходной схеме, это не будет проблемой.

Я представил вопрос JIRA здесь:

https://issues.apache.org/jira/projects/FLINK/issues/FLINK-11399

Будет обновлять этот пост соответственно

0
ответ дан BenoitParis 16 January 2019 в 19:39
поделиться