Не могли бы вы помочь мне с одним сложным оператором выбора?
У меня есть такая таблица:
+----+-----------+-----------+-----------------+
| 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 |
+----+-----------+-------------+-----------------+
Как сказал @TimBiegeleisen, добавьте в сообщение таблицу желаемого вывода. Что насчет Алекса, например. Должен ли он / она появиться один или два раза?
@Ulquiorra: Можете ли вы обновить ожидаемый результат?


Вы можете использовать условную агрегацию:
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;
Зачем нужна агрегация?
@ BarbarosÖzhan Потому что, насколько я понимаю требования, OP хочет, чтобы date1 и date3 были в одной строке для каждого User_name.
Большое спасибо, это работает. Мне просто нужно было добавить WHERE к первому SELECT - иначе в результатах были какие-то странные строки (в реальной таблице с большим количеством данных). Итак, это работает с этим: ОТ вкладки t ГДЕ Ситуация = 1 ИЛИ Ситуация = 3
@Ulquiorra Рад это слышать. Вы можете принять мой ответ (Как работает принятие ответа?), если ваш вопрос решен :)
Пожалуйста, исправьте форматирование вашей таблицы и покажите нам, как будет выглядеть ожидаемый результат. И включите любой запрос, который вы уже пробовали.