Итак, я каталогизировал данные в корзине S3, которая очень похожа на эти данные здесь:
+-----+-----------+---------+-----------------------+
| id | title | event | time |
+-----+-----------+---------+-----------------------+
|1 | book A | BORROW | 2018-07-01 09:00:00 |
|1 | book A | RETURN | 2018-08-01 09:00:00 |
|2 | book B | BORROW | 2018-08-01 13:00:00 |
|2 | book B | RETURN | 2018-10-01 17:00:00 |
|1 | book A | BORROW | 2018-11-01 09:00:00 |
|1 | book A | RETURN | 2018-12-01 09:00:00 |
+-----+-----------+---------------------------------+
Я в основном хочу иметь возможность написать оператор SELECT в Amazon Athena, который отображает время заимствования и возврата рядом друг с другом в строке, например:
+-----+-----------+-----------------------+-----------------------+
| id | title | borrow_time | return_time |
+-----+-----------+-----------------------+-----------------------+
|1 | book A | 2018-07-01 09:00:00 | 2018-08-01 09:00:00 |
|2 | book B | 2018-08-01 13:00:00 | 2018-10-01 17:00:00 |
|1 | book A | 2018-11-01 09:00:00 | 2018-12-01 09:00:00 |
+-----+-----------+-----------------------+-----------------------+
Я потратил кучу времени на написание около 5 разных запросов (используя такие вещи, как OUTER APPLY
, но Афина, похоже, очень чувствительна к работе, особенно учитывая, что у нее нет никаких функций с OUTER APPLY
. Это логика для моих последних утверждение:
SELECT b.id,
b.title,
b.time AS borrow_time,
MIN(r.time) AS return_time
FROM (
SELECT id,
title,
time
FROM books
WHERE event = 'BORROW'
) b
OUTER JOIN (
SELECT id,
time
FROM books
WHERE event = 'RETURN'
) r
ON b.id = r.id
AND b.time < r.time
GROUP BY b.id,
b.title,
borrow_time
ORDER BY borrow_time;
Мы будем очень благодарны за любые идеи, чтобы обойти это!