#sql #postgresql #subquery
#sql #postgresql #подзапрос
Вопрос:
Я новичок в PostgreSQL и многому научился за короткое время, но еще не всему научился, поэтому простите меня, если это простой вопрос. Я искал это, и объединение должно объединить их, но с моей настройкой я не могу заставить это работать.
ПРОБЛЕМА У меня есть оператор WITH, в котором указаны все критерии для того, что я хочу найти, тогда я хочу, чтобы вы выполнили два запроса SELECT, по одному для каждого пользователя (одновременно будет выполняться поиск только для 2 пользователей)
ДАННЫЕ Данные состоят из времени и количества, в предложении with будут критерии, при которых в запросах будет использоваться только имя пользователя.
ПРИМЕР
HOUR AMOUNT
01 200
02 300
03 500
04 800
Используя ОБЪЕДИНЕНИЕ, я получаю оба запроса в одном столбце
HOUR AMOUNT
01 200
01 75
02 300
02 50
03 500
03 21
04 800
04 300
Но я просто хочу, чтобы второй запрос отображался в новом столбце
HOUR AMOUNT AMOUNT2
01 200 75
02 300 50
03 500 21
04 800 300
Я упростил SQL, чтобы он не был слишком длинным:
WITH My_With AS (
...
)
SELECT time, count(time) AS Column_1
FROM My_With
WHERE
username= 'jon'
GROUP BY time
UNION
SELECT time, count(time) AS Column_2
FROM My_With
WHERE
username= 'bob'
GROUP BY time
ORDER BY time
;
Я знаю, что это, вероятно, действительно просто, но я просто не могу в этом разобраться, мне удалось поместить второй набор сумм во второй столбец, но он по-прежнему генерирует 2 потока за время.
Комментарии:
1. В примере данных есть столбец «час», но для запросов указано время.
Ответ №1:
Я думаю, вы можете делать то, что хотите, с помощью условной агрегации:
SELECT time,
COUNT(*) FILTER (WHERE username = 'jon') as cnt_jon,
COUNT(*) FILTER (WHERE username = 'bob') as cnt_bob
FROM My_With
GROUP BY time;
Или, с меньшим количеством ввода:
SELECT time,
SUM( (username = 'jon')::int ) as cnt_jon,
SUM( (username = 'bob')::int ) as cnt_bob
FROM My_With
GROUP BY time;
Комментарии:
1. Ты легенда