Время прочтения: 3 мин.

Загрузим тестовую таблицу c необходимой для проверки информацией о картах клиента, для демонстрации некоторых возможностей Teradata SQL:

В Teradata удобно реализована возможность разбиения столбца по разделителю. Для этого используется метод strtok ([столбец], [разделитель], [порядковый номер возвращаемого токена]). Благодаря нему можно создать столбец на основе уже существующего.

Разделим в нашей таблице столбец fullname по разделителю ‘,’:

select 
a.num_account
,a.num_card
,a.issue_date
,strtok( a.fullname,',',1) as surname
,strtok( a.fullname,',',2) as firstname
,strtok( a.fullname,',',3) as middlename 
from accounts a

В T-SQL присутствует похожий метод string_split, который работает несколько иным образом. Он принимает на вход символьную строку и разбивает ее на подстроки по заданному разделителю, которые формируют значения унарной таблицы.

Для одной строки из столбца fullname — это будет выглядеть так:

Что заставляет производить дополнительные манипуляции (к примеру, cross apply и последующий pivot), чтобы привести в вид, аналогичный применению метода strtok.

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

select 
 a.num_account
,a.num_card
,a.issue_date
,strtok( a.fullname,',',1) as surname
,strtok( a.fullname,',',2) as firstname
,strtok( a.fullname,',',3) as middlename 
from accounts a
qualify 1 = dense_rank() over(partition by num_account order by issue_date desc)

Результат выполнения запроса будет выглядеть так:

Также qualify позволяет ссылаться на псевдонимы столбцов, определённых в списке Select. Это позволяет переписать предыдущий запрос и результат будет идентичен.

select 
 a.num_account
,a.num_card
,a.issue_date
,strtok( a.fullname,',',1) as surname
,strtok( a.fullname,',',2) as firstname
,strtok( a.fullname,',',3) as middlename 
,dense_rank() over(partition by num_account order by issue_date desc) as rnk
from accounts a
qualify rnk=1

Знание нюансов работы каждой СУБД позволяет пользователю не теряться в подборе своего решения и останавливать свой выбор на наиболее эффективном и подходящем в данной ситуации. Иногда это просто добавляет вариативности, так как не бывает единственного правильного решения задачи. Исходя из этого можно сделать вывод, который заключается в том, что не нужно останавливаться на изучении какого-то одного продукта, вариативность всегда будет хорошим подспорьем в решении задач.