Выберите ближайшую дату из другой таблицы SQL - PullRequest
0 голосов
/ 17 марта 2020

У меня есть две таблицы в BigQuery:

таблица 1:

EmailName   SentDateTime
Checkout    01/01/2020 12:48
Checkout    15/01/2020 06:21
Checkout    16/01/2020 09:23

таблица 2:

EmailName  EventType  EventDateTime
Checkout   Open       02/01/2020 13:29
Checkout   Open       11/01/2020 12:49
Checkout   Open       03/01/2020 14:30 
Checkout   Click      11/01/2020 12:51
Checkout   Open       16/01/2020 07:30
Checkout   Open       16/01/2020 10:00   

Я хотел бы добавить ближайший SentDateTime, где EventDateTime больше, чем SentDateTime. Поэтому результат должен выглядеть следующим образом:

EmailName  EventType    EventDateTime       SentDateTime
Checkout   Open         02/01/2020 13:29    01/01/2020 12:48
Checkout   Open         11/01/2020 12:49    01/01/2020 12:48
Checkout   Open         03/01/2020 14:30    01/01/2020 12:48
Checkout   Click        11/01/2020 12:51    01/01/2020 12:48
Checkout   Open         16/01/2020 07:30    15/01/2020 06:21  
Checkout   Open         16/01/2020 10:00    16/01/2020 09:23 

Ответы [ 3 ]

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

Вы можете сделать это, комбинируя таблицы и используя оконные функции:

with t as (
      select EmailName, SentDateTime, null as EventType, null as EventDateTime
      from table1
      union all
      select EmailName, null as SentDateTime, EventType, EventDateTime
      from table2
     )
select t.* except (SentDateTime)
from (select t.*,
             max(SentDateTime) over (partition by emailName order by coalesce(SentDateTime, EventDateTime)) as imputed_SentDateTime
      from t
     ) t
where SentDateTime is null;
1 голос
/ 17 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT ANY_VALUE(e).*, MAX(SentDateTime) SentDateTime
FROM `project.dataset.table2` e
JOIN `project.dataset.table1` s
ON e.EmailName = s.EmailName
AND EventDateTime > SentDateTime 
GROUP BY FORMAT('%t', e)
0 голосов
/ 17 марта 2020
-- preparing mock tables
DROP TABLE IF EXISTS #Table1
DROP TABLE IF EXISTS #Table2

CREATE TABLE #Table1 ( EmailName VARCHAR(50), SentDateTime DATETIME)
CREATE TABLE #Table2 ( EmailName VARCHAR(50), EventType VARCHAR(20), EventDateTime DATETIME)

INSERT INTO #TABLE1
SELECT 'Checkout', '2020-01-01 12:48' UNION
SELECT 'Checkout', '2020-01-15 06:21' UNION
SELECT 'Checkout', '2020-01-16 09:23' 

INSERT INTO #TABLE2
SELECT 'Checkout', 'Open',  '2020-01-02 13:29' UNION
SELECT 'Checkout', 'Open',  '2020-01-11 12:49' UNION
SELECT 'Checkout', 'Open',  '2020-01-03 14:30' UNION
SELECT 'Checkout', 'Click', '2020-01-11 12:51' UNION
SELECT 'Checkout', 'Open',  '2020-01-16 07:30' UNION
SELECT 'Checkout', 'Open',  '2020-01-16 10:00' 

-- query you care about
SELECT * 
FROM #Table2 B
OUTER APPLY
(
    SELECT TOP 1 * 
    FROM #Table1
    WHERE SentDateTime < EventDateTime
    ORDER BY SentDateTime DESC
) a
ORDER BY SentDateTime, EventDateTime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...