Проверка состояния за 1 день до даты

#sql #hive #hiveql

#sql #улей #hiveql

Вопрос:

У меня есть простая таблица t1 , которая содержит id даты и даты реализации (продукта):

 | id    | implementation_date |
|-------|---------------------|
| 90    | 2020-01-03          |
| 3453  | 2020-01-03          |
| 1324  | 2020-01-03          |
| 75133 | 2020-01-03          |
| 11143 | 2020-01-03          |
| 21411 | 2020-01-03          |
...
...
 

Затем у меня есть вторая таблица t2 , которая представляет собой ежедневный журнал ids и погоду, которую они имеют право внедрять или нет:

 | id         | yyyy_mm_d  | eligible_status |
|------------|------------|-----------------|
| 90         | 2020-01-01 | 1               |
| 3453       | 2020-01-01 | 1               |
| 1324       | 2020-01-01 | 0               |
| 75133      | 2020-01-01 | 1               |
| 11143      | 2020-01-01 | 1               |
| 90         | 2020-01-02 | 1               |
| 3453       | 2020-01-02 | 1               |
| 1324       | 2020-01-02 | 0               |
| 75133      | 2020-01-02 | 1               |
| 11143      | 2020-01-02 | 1               |
...
...
 

Как я мог бы написать запрос, который будет выбирать, что eligible_status было для каждого id дня, предшествующего его implementation_date .

Обратите внимание, что не все идентификаторы в t1 могут иметь строку за t2 день до implementation_date , в таких случаях было бы здорово указать это.

Пример вывода:

 | id    | implementation_date | eligible_status_day_before_implementation |
|-------|---------------------|-------------------------------------------|
| 90    | 2020-01-03          | 1                                         |
| 3453  | 2020-01-03          | 1                                         |
| 1324  | 2020-01-03          | 0                                         |
| 75133 | 2020-01-03          | 1                                         |
| 11143 | 2020-01-03          | 1                                         |
| 21411 | 2020-01-03          | no_rows_found_prior_to_implementation     |
 

Ответ №1:

 select 
    t1.id,
    t1.implementation_date,
    coalesce(t2.eligible_status, 
        "no_rows_found_prior_to_implementation")
        as eligible_status_day_before_implementation
from t1
left join t2
on to_date(t1.implementation_date) = date_add(to_date(t2.yyyy_mm_d), 1)
    and t1.id = t2.id
 

Комментарии:

1. Интервал, похоже, выдает ошибку — cannot recognize input near 'interval' '1' 'day' in expression specification

2. date_add действительно работает! Хотя, не следует ли нам выполнять date_add для t1.implementation_date? Поскольку мы хотим видеть соответствующий статус за предыдущий день?

3. @Someguywhocodes вы хотите, чтобы t2 = день до t1, т.е. t2 = t1 — 1 или t1 = t2 1