#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