Создайте временную таблицу в HANA и поместите данные, используя предложение WITH - PullRequest
0 голосов
/ 06 февраля 2020

Как поместить результат этого во временную таблицу в HANA? Я новичок в HANA. Прямо сейчас он возвращает правильные данные, но мне нужно поместить их или вставить в таблицу, чтобы связать их с другими таблицами.

WITH monthss("MonthNumber") AS (
                SELECT 0 FROM "DUMMY" 
                UNION ALL 
                SELECT 1 FROM "DUMMY"
                UNION ALL 
                SELECT 2 FROM "DUMMY" 
                UNION ALL 
                SELECT 3 FROM "DUMMY" 
                UNION ALL 
                SELECT 4 FROM "DUMMY" 
                UNION ALL 
                SELECT 5 FROM "DUMMY"
                UNION ALL 
                SELECT 6 FROM "DUMMY"           
                UNION ALL 
                SELECT 7 FROM "DUMMY"
                UNION ALL 
                SELECT 8 FROM "DUMMY"                       
                UNION ALL 
                SELECT 9 FROM "DUMMY"
                UNION ALL 
                SELECT 10 FROM "DUMMY"                      
                UNION ALL 
                SELECT 11 FROM "DUMMY"
                UNION ALL 
                SELECT 12 FROM "DUMMY"                      
                UNION ALL 
                SELECT 13 FROM "DUMMY"          
            )  
             SELECT 
                ADD_MONTHS(current_date, -"MonthNumber") AS "Date"
             FROM monthss

1 Ответ

1 голос
/ 07 февраля 2020

Похоже, что целью запроса OP является создание вспомогательной таблицы (вспомогательной таблицы), которая содержит даты сегодняшнего дня и тринадцать предыдущих месяцев.

Вывод выглядит примерно так (если current_date возвращает 2020-02-07):

|Date      |
|----------|
|2020-02-07|
|2020-01-07|
|2019-12-07|
|2019-11-07|
|2019-10-07|
|2019-09-07|
|2019-08-07|
|2019-07-07|
|2019-06-07|
|2019-05-07|
|2019-04-07|
|2019-03-07|
|2019-02-07|
|2019-01-07| 

Хотя использование UNION ALL -техники, безусловно, работает, ее трудоемко писать и поддерживать, она действительно работает только для небольшого набора результатов и очень многословна. Хуже - ИМО - он фокусируется на «как» построения набора результатов, а не на «что» и «почему».

К счастью, есть альтернативы этому.

Вариант 1 - GENERATE_SERIES

Используйте функцию GENERATE_SERIES, которая была доступна в течение многих лет (она даже доступна в HANA 1 SP12):

SELECT
    GENERATED_PERIOD_START AS "Date"
FROM 
    SERIES_GENERATE_DATE ('INTERVAL 1 MONTH'              -- step length
                        , add_months(current_date, -13)   -- lower end
                        , current_date)                   -- upper END
ORDER BY 
    "Date" ASC;

Эта опция намного больше кратко, ясно о цели (для генерации ряда дат) и особенностях (длина шага, минимальная и максимальная даты и порядок вывода). Кроме того, это намного быстрее (хорошо, это срабатывает только при создании больших диапазонов).

Вариант 2 - M_TIME_DIMENSION

Использовать саму спецификацию HANA c встроенный календарь aux-table _SYS_REPO.M_TIME_DIMENSION

select 
    date_sql as "Date"
from
    _SYS_BI.M_TIME_DIMENSION td
where
    date_sql between add_months (current_date, -13)   
                 and current_date
    and day = extract (DAY from current_date) 
order by "Date" ASC;

Хотя это менее читабельно, на мой взгляд, оно все же лучше и гибче, чем оригинальный подход.
Также обратите внимание, что для этого необходимо, чтобы таблица была заполнена (через «генерировать данные времени» ) для работы.

Теперь оба эти подхода просто создать наборы результатов, но ОП попросил сохранить их во временных таблицах. Первый очевидный ответ заключается в том, что оба утверждения можно объединить с INSERT. Однако я бы порекомендовал , а не , сделать это вообще.

При варианте 2) данные уже находятся в таблице. Если запрос для получения диапазона следует повторно использовать в нескольких независимых операторах, то создание представления SQL поможет (и будет правильным решением).

В случае этих независимых операторов в противном случае использовались бы Если временная таблица является частью блока SQLScript, то гораздо лучше выбрать просто присвоить результат запроса переменной таблицы и ссылаться на эту переменную таблицы во всем блоке SQLScript.

...