Меню

Задачки в HANA. Ответы

Небольшие задачки в HANA - полезны для изучения и ознакомления. В статье представлены решения 10 задач.

Введение.

Ниже представлены задачи из (ссылка) и их решения. Решения актуальны для HANA SP7, но большинство (кроме задачи 6) будут работать также и в SP6. 

Задача 1.

Дана таблица, в которой есть один столбец (см. Таб.1.), содержащий численно-буквенные, а также только численные значения.

Необходимо выбрать только численные значения (см. Таб.2.)

Примечания:

  1. Dynamic SQL и курсоры не использовать.
  2. Возможны два варианта решения.

Решение 1:

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

… where upper(q)=lower(q)

Решение 2:

Если значения в столбце представлены также и специальными символами, то подойдёт использование функции ltrim(), которая удаляет слева символы указанные в шаблоне(если содержатся только цифры – значение будет пустым):

where ltrim(q,'0123456789')=''

Задача 2.

Почему, если взять заполненную таблицу M_TIME_DIMENSION, не работает рассчитанная колонка adddays("DATESQL",1)?

Решение:

Потому что максимальная дата равна 31.12.9999, а год 10000 в дате невозможен.

Задача 3

Есть вью следующего вида: select adder(“pole1”,”pole2”) as tt,”pole1”,”pole2” from “schema”.“tab”, где столбец tt – это результат сложения pole1+pole2*0.13. Как это сделано?

Решение:

Скалярная фукнция(UDF) :

CREATE FUNCTION adder(pole1 decimal(15,2),pole2 decimal(15,2))

RETURNS quantity decimal(15,2)

LANGUAGE SQLSCRIPT SQL SECURITY INVOKER AS

BEGIN

quantity:= :pole1 + :pole2*0.13;

END;

Задача 4

Используя только CE_* функции, сделать cross-join таблицы самой к себе.

Решение:

Для формирования cross-join-а на таблице достаточно добавить поле с константой, а потом любой join по этой константе.

Задача 5

Задать переменную сессии. Запросом считать её значение.

Решение:

SET 'MY_VAL' ='123'

SELECT SESSION_CONTEXT('MY_VAL') FROM DUMMY;

Задача 6

Сделать запрос (без создания дополнительных таблиц,только dummy) для генерации значений от 0 до 100. Результатом должен быть столбец со значениями от 0 до 100 (union 100 раз dummy не допускается).

Решение:

Данная задача разбивается на две части:

1) Формирование таблицы где есть 101 запись.

Наиболее простой способ сгенерировать записи – это cross-join таблицы к себе же.

Найдем чему равны x:

logx 100 = 7  x ~ 1,93 (то есть 2 раз dummy cross-join 7 раз)

logx 100 = 3  x ~ 4,64 (то есть 5 раз dummy cross-join 3 раза) Конечно, можно делать copy-past-ы, но гораздо приятнее воспользоваться возможностями SP7 (Оператор with) (ниже представлены оба варианта)

 1)

            with a as (select 1 as q from dummy union all select 1 as q from dummy)

 select 1 as q from a,a,a,a,a,a,a limit

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти