SQL-запрос для сравнения значений столбцов

#sql #teradata

#sql #teradata

Вопрос:

У меня есть приведенный ниже шаблон данных, и мне нужно написать SQL для проверки тестовых сценариев, как показано ниже. Это всего лишь пример, в моей таблице миллионы записей, и для проверки требуется sql. Любая помощь / предложение были бы действительно оценены.

  1. EFEC_FROM из RANK_ORDER 2= EFEC_2 из RANK_ORDER =1
  2. EFEC_FROM из RANK_ORDER 3= EFEC_2 из RANK_ORDER =2
  3. 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;