Сложный оператор SELECT в БД Oracle - PullRequest
0 голосов
/ 27 мая 2018

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

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

+----+-----------+-----------+-----------------+
| 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 |
+----+-----------+-----------+-----------------+

И мне нужно утверждение select, которое даст мне следующий результат: Имя_пользователя, дата_время_1 (дата_время ситуации 1), дата_время_3 (дата_время ситуации 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 |
+----+-----------+-------------+-----------------+

1 Ответ

0 голосов
/ 27 мая 2018

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

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;

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

В этом случае результат будет иметь только 3 строки (2 для Алекса и 1 для Джонни)

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 Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...