Сложный оператор SELECT в Oracle DB

Не могли бы вы помочь мне с одним сложным оператором выбора?

У меня есть такая таблица:

+----+-----------+-----------+-----------------+
| ID | User_name | Situation |    Date_time    |
+----+-----------+-----------+-----------------+
|  1 | Alex      |         1 |   14.3.18 11:30 |
|  4 | Alex      |         2 |   14.3.18 11:35 |
|  6 | Alex      |         3 |   14.3.18 12:30 |
|  7 | Johnny    |         1 |   15.3.18 10:01 |
|  9 | Johnny    |         2 |   15.3.18 10:05 |
| 12 | Johnny    |         3 |   15.3.18 10:20 |
| 14 | Alex      |         1 |   20.3.18 20:00 |
| 15 | Alex      |         2 |   20.3.18 20:25 |
| 17 | Alex      |         3 |   20.3.18 21:25 |
+----+-----------+-----------+-----------------+

И мне нужен оператор выбора, который даст мне следующий результат: User_name, Date_time_1 (Date_time ситуации 1), Date_time_3 (Date_time ситуации 3).

* В этом случае результат будет иметь всего 3 строки (2 для Алекса и 1 для Джонни). Каждая строка будет содержать 3 столбца, как описано выше.

И простите за форматирование - выложил с мобилы. Я добавлю таблицу результатов, когда доберусь до ПК. *

Вот как должен выглядеть результат:

+----+-----------+-------------+-----------------+
| ID | User_name |Date_time_1  |   Date_time_3   |
+----+-----------+-------------+-----------------+
|  1 | Alex      |14.3.18 11:30|   14.3.18 12:30 |
|  2 | Johnny    |15.3.18 10:01|   15.3.18 10:20 |
|  3 | Alex      |20.3.18 20:00|   20.3.18 21:25 |
+----+-----------+-------------+-----------------+

Пожалуйста, исправьте форматирование вашей таблицы и покажите нам, как будет выглядеть ожидаемый результат. И включите любой запрос, который вы уже пробовали.

Tim Biegeleisen 27.05.2018 17:30

Как сказал @TimBiegeleisen, добавьте в сообщение таблицу желаемого вывода. Что насчет Алекса, например. Должен ли он / она появиться один или два раза?

wolφi 27.05.2018 17:54

@Ulquiorra: Можете ли вы обновить ожидаемый результат?

user8406805 27.05.2018 18:38
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать условную агрегацию:

SELECT User_name,
      MAX(CASE WHEN Situation = 1 THEN Date_time END) AS date_time_1,
      MAX(CASE WHEN Situation = 3 THEN Date_time END) AS date_time_3
FROM tab
GROUP BY User_name;

РЕДАКТИРОВАТЬ

In this case the result will have just 3 rows (2 for Alex and 1 for Johnny)

WITH cte AS (
   SELECT t.*, SUM(CASE WHEN Situation=1 THEN 1 ELSE 0 END)
          OVER(PARTITION BY User_name ORDER BY id) AS s
   FROM tab t
)
SELECT User_name,
      MAX(CASE WHEN Situation = 1 THEN Date_time END) AS date_time_1,
      MAX(CASE WHEN Situation = 3 THEN Date_time END) AS date_time_3
FROM cte
GROUP BY s, User_name;

Демо DBFiddle

Зачем нужна агрегация?

Barbaros Özhan 27.05.2018 17:39

@ BarbarosÖzhan Потому что, насколько я понимаю требования, OP хочет, чтобы date1 и date3 были в одной строке для каждого User_name.

Lukasz Szozda 27.05.2018 17:40

Большое спасибо, это работает. Мне просто нужно было добавить WHERE к первому SELECT - иначе в результатах были какие-то странные строки (в реальной таблице с большим количеством данных). Итак, это работает с этим: ОТ вкладки t ГДЕ Ситуация = 1 ИЛИ Ситуация = 3

Ulquiorra 28.05.2018 11:21

@Ulquiorra Рад это слышать. Вы можете принять мой ответ (Как работает принятие ответа?), если ваш вопрос решен :)

Lukasz Szozda 28.05.2018 11:25

Другие вопросы по теме