#sql #teradata
#sql #teradata
Вопрос:
У меня есть приведенный ниже шаблон данных, и мне нужно написать SQL для проверки тестовых сценариев, как показано ниже. Это всего лишь пример, в моей таблице миллионы записей, и для проверки требуется sql. Любая помощь / предложение были бы действительно оценены.
- EFEC_FROM из RANK_ORDER 2= EFEC_2 из RANK_ORDER =1
- EFEC_FROM из RANK_ORDER 3= EFEC_2 из RANK_ORDER =2
- EFEC_FROM из RANK_ORDER 4= EFEC_2 из RANK_ORDER =3
И данные:
S_KEY FLAG_1 FLAG_2 EFEC_FROM EFEC_2 RANK_ORDER
100 1 0 2019-02-28 15:04:00.000000 2019-02-28 15:13:00.006000 1
100 0 0 2019-02-28 15:13:00.006000 2019-02-28 15:19:00.011000 2
100 0 0 2019-02-28 15:19:00.011000 2019-02-28 15:20:00.014000 3
100 0 1 2019-02-28 15:20:00.014000 2099-12-31 00:00:00.000000 4
Комментарии:
1. вы можете использовать функции опережения и задержки для получения столбцов после / перед строкой blog.sqlauthority.com/2011/11/15 /…
Ответ №1:
Чтобы выяснить, какие строки не соответствуют вашему правилу проверки, вы можете использовать функции LAG()
или LEAD()
, как в:
with
x as (
select
s_key, flag_1, flag_2, efec_from, efec_2, rank_order,
lag(efec_2 order by rank_order) prev_efec_2
from my_table
)
select *
from x
where efec_from <> prev_efec_2
Комментарии:
1. Спасибо. Я смог подтвердить выполнение запроса как, ВЫБЕРИТЕ * FROM (ВЫБЕРИТЕ s_key, flag_1, flag_2, efec_from, efec_2, ОБЪЕДИНИТЕ (MIN (efec_from) OVER (РАЗДЕЛЕНИЕ По ПОРЯДКУ s_key По rank_order asc), ВРЕМЕННАЯ МЕТКА ‘2099-12-31 00:00:00’) как NEXT_efec_from ИЗ таблицы), ГДЕ efec_2 <> next_efec_from;
Ответ №2:
Вам определенно необходимо использовать функции ЗАДЕРЖКИ / опережения для получения информации из предыдущей или следующей строки в наборе данных.
SELECT * FROM (
SELECT s_key,
flag_1,
flag_2,
efec_from,
efec_2,
rank_order
NVL ( LEAD (efec_from, 1)
OVER (PARTITION BY s_key
ORDER BY rank_order),
'2099-12-31') AS next_efec_2
FROM table)
WHERE efec_2 <> next_efec_from
Дополнительный источник информации о задержке / опережении:https://docs.teradata.com/reader/756LNiPSFdY ~4JcCCcR5Cw/NbZIb7BVEkYT9tMbXxOuog
Комментарии:
1. Спасибо. Я смог подтвердить выполнение запроса как, ВЫБЕРИТЕ * FROM (ВЫБЕРИТЕ s_key, flag_1, flag_2, efec_from, efec_2, ОБЪЕДИНИТЕ (MIN (efec_from) OVER (РАЗДЕЛЕНИЕ По ПОРЯДКУ s_key По rank_order asc), ВРЕМЕННАЯ МЕТКА ‘2099-12-31 00:00:00’) как NEXT_efec_from ИЗ таблицы), ГДЕ efec_2 <> next_efec_from;