Запрос, чтобы получить строки на основе дат из двух таблиц в Афине - PullRequest
0 голосов
/ 18 марта 2020

У меня есть две таблицы с именами master_tbl и anom_table следующим образом:

master_tbl

 date         id     country    value     
     2017-01-01   26      US        2            
     2017-01-02   26      US        4             
     2017-01-03   26      US        9             
     2017-01-04   26      US        2             
     2017-01-05   26      US        4             
     2017-01-06   26      US        1
     2017-01-07   26      US        5
     2017-01-08   26      US        3
     2017-01-09   26      US        100
     2017-01-10   26      US        4 

anom_tbl

date         id  country     anoms
 2017-01-01   26      US        0
 2017-01-02   26      US        0
 2017-01-03   26      US        9
 2017-01-04   26      US        0
 2017-01-05   26      US        0
 2017-01-06   26      US        0
 2017-01-07   26      US        0
 2017-01-08   26      US        0
 2017-01-09   26      US        100
 2017-01-10   26      US        0

Я хочу создать третью таблицу из master_tbl и присоединиться с помощью anom_tbl для выбора только тех строк, даты которых имеют значение в столбце anom из anom_tbl и за один день до и через один день после этой даты из master_tbl

Наконец, я хочу получить следующую таблицу

date         id  country     value
 2017-01-02   26      US        2
 2017-01-03   26      US        9
 2017-01-04   26      US        4
 2017-01-08   26      US        3
 2017-01-09   26      US        100
 2017-01-10   26      US        4

, поскольку у меня большие данные, мне нужно время, чтобы запустить их в R или python, затем я хочу создать таблицу в AWS (Афина)

Я попробовал следующий код в Афине, однако он не работает

FROM 
    (SELECT t2.value,
         t1.id,
         t1.country AS country,
         cast(t1.date AS DATE) AS orig_date
    FROM 
        (SELECT id,
         country,
         date
        FROM anom_tbl) t1
        JOIN master_tbl t2
            ON t2.id=t1.id
                AND t2.country= t1.country
                AND t2.date=t1.date) t3
    JOIN master_tbl t2
    ON t3.id=t2.id
        AND t3.country=t2.country 
        where t2.date IN(GETDATE()-1)  

Не могли бы вы помочь мне изменить код sql, чтобы получить правильный результат.

1 Ответ

1 голос
/ 18 марта 2020

Если Я следовал за вами правильно, вы могли бы сделать это с помощью exists:

select m.*
from master_tbl m
where exists (
    select 1
    from anom_tbl a
    where 
        a.anoms <> 0
        and a.id = m.id 
        and a.country = m.country
        and m.date >= a.date - interval '1' day
        and m.date <= a.date + interval '1' day
)

Это приводит к тому, что все записи в основной таблице, для которой в таблице аном существует другая запись для того же идентификатора и страны с ненулевым значением в интервале +/- 1 день.

...