Сценарий SQL: новый столбец 1, если значение существует в другом столбце, иначе 0

У меня есть первая таблица T1 в базе данных SAP HANA, например:

T1
----------------------------
| key | value | date       |
----------------------------
| 1   |  A    | 01-02-2018 |
| 2   |  B    | 01-03-2017 |
| 3   |  C    | 01-02-2017 |
| 4   |  D    | 01-02-2018 |
----------------------------

И другая таблица T2:

T2
---------------------
| value | date       |
----------------------
|  B    | 01-02-2017 |
|  B    | 01-05-2017 |
|  D    | 01-02-2019 |
----------------------

Мне нужно добавить в T1 новый столбец как индикатор со значением «1», если T1.value существует в T2.value и T2.date < T1.date для этого значения, иначе «0». Для этого я могу использовать только запрос выбора или SQL-скрипт, без операторов вставки или обновления.

Ожидаемый результат:

----------------------------------------
| key | value | date        | indicator |
----------------------------------------
| 1   |  A    | 01-02-2018  | 0         |
| 2   |  B    | 01-03-2017  | 1         |
| 3   |  C    | 01-02-2017  | 0         |
| 4   |  D    | 01-02-2018  | 0         |
-----------------------------------------

Пожалуйста, помогите с запросом или скриптом на HANA SQL.


person hakeydotcom    schedule 19.04.2019    source источник
comment
Рад помочь в любое время. Вы пробовали написать какой-нибудь sql? Подсказка: ищите в SQL предложение CASE   -  person Abhijith Nagarajan    schedule 19.04.2019


Ответы (2)


Мне нужно добавить в T1 новый столбец в качестве индикатора со значением «1», если T1.value существует в T2.value и T2.date ‹T1.date для этого значения, иначе« 0 ».

Это решается с помощью EXISTS:

select 
  t1.*,
  case 
    when exists (
      select 1 from t2 
      where value = t1.value and date < t1.date
    ) then '1'
    else '0'
  end indicator
from t1
person forpas    schedule 19.04.2019
comment
exists - правильное решение. Я проголосовал за, но настоятельно рекомендую, чтобы все столбцы были дополнены соответствующим псевдонимом таблицы. - person Gordon Linoff; 19.04.2019

Вы можете использовать correlated subquery

select T1.*, 
       ( select sign(count(1)) from T2 where T2.date < T1.date and T2.value = T1.value )
       as indicator
  from T1;

Функция sign() возвращает 1 при условии, что есть хотя бы одна строка, удовлетворяющая условию

Демо

person Barbaros Özhan    schedule 19.04.2019
comment
@forpas, спасибо, мне также нужно добавить функцию sign(). - person Barbaros Özhan; 19.04.2019