#postgresql
#postgresql
Вопрос:
Я хочу получить все значения array_agg() с одним совпадающим значением.
Например, если внутри robotsession."Session_OS"
есть несколько значений [‘Android’, ‘IOS’, ‘Windows’]
В моем текущем запросе он выдает только [‘Android’]. Но я хочу все.
Мой запрос:
SELECT robotAds."Ad_ID",
ARRAY_AGG(DISTINCT quote_literal(robotSession."Session_OS"))
as Session_OS
FROM robot__ads robotAds LEFT JOIN
robot__session__scraper__data robotScraper ON
robotScraper."adIDAdID" = robotAds."Ad_ID" LEFT JOIN
robot__session_data robotSession ON robotSession."id" = robotScraper."sessionIDId" WHERE
robotScraper."sessionIDId" IS NOT NULL
AND robotsession."Session_OS" IN ('Android')
GROUP BY robotAds."Ad_ID"
В результате этого запроса «Session_OS» выдает только значение «Android».
И примерные данные этого запроса выглядят следующим образом:
id | Session_OS
-------|-------------
641 | {'Android'}
642 | {'Android'}
643 | {'Android'}
Но я хочу, чтобы все значения, которые находятся В агрегации Session_Os, соответствовали какому-либо из них. как и здесь, в моем запросе, он совпадает с «Android»:
id | Session_OS
-------|-------------
641 | {'Android, 'IOS'}
642 | {'Android, 'Windows'}
643 | {'Android', 'IOS', 'Windows'}
Как я могу этого добиться??
Обновить:
Полные данные, без этого условия в запросе AND robotsession."Session_OS" IN ('Android')
id | Session_OS
-------|-------------
641 | {'Android, 'IOS'}
642 | {'Android, 'Windows'}
643 | {'Android', 'IOS', 'Windows'}
644 | {'IOS', 'Windows'}
645 | {'IOS'}
Но после добавления этого условия AND robotsession."Session_OS" IN ('Android')
в результат запроса
id | Session_OS
-------|-------------
641 | {'Android'}
642 | {'Android'}
643 | {'Android'}
Но я хочу этого. Как я могу это сделать?
id | Session_OS
-------|-------------
641 | {'Android, 'IOS'}
642 | {'Android, 'Windows'}
643 | {'Android', 'IOS', 'Windows'}
Комментарии:
1. a) Пожалуйста, сведите ваш пример кода к абсолютно необходимым частям, которые имеют отношение к описанию вашей проблемы. Т.е. Я думаю, нет необходимости показывать нам 3 или 4 соединения. б) Пожалуйста, добавьте некоторые примеры данных и ожидаемый результат, чтобы мы могли воспроизвести вашу проблему
2. Привет, спасибо за быстрый ответ. Я обновил свой вопрос. Пожалуйста, проверьте еще раз.
3. что такое quote_literal() . Пожалуйста, покажите данные перед группировкой
4. quote_literal() — это ничто. Вы можете игнорировать это. Это просто добавить кавычки («) к каждому значению.
5. Пожалуйста, проверьте обновленный вопрос.
Ответ №1:
SELECT
id,
ARRAY_AGG(session_os)
FROM
t
GROUP BY id
HAVING ARRAY_AGG(session_os) amp;amp; ARRAY['Android']
Ваша проблема заключается в том, что вы СНАЧАЛА фильтруете записи с session_os = Android
помощью . И после этого вы объединяете их.
Сначала вам нужно выполнить агрегирование, а затем просмотреть агрегированный массив, если Android является элементом. Это можно сделать с помощью HAVING
предложения и amp;amp;
оператора, который возвращает true, если два массива содержат одинаковые элементы.
Комментарии:
1. Привет, спасибо, это работает. Есть еще одна проблема. Что делать, если в ARRAY_AGG(session_os) есть нулевое значение?. Выдает ошибку. ОШИБКА: массив не должен содержать нулевые значения Состояние SQL: 22004
2. Привет, спасибо, что это работает. Есть еще одна проблема. Что делать, если в ARRAY_AGG(session_os) есть нулевое значение?. Выдает ошибку. ОШИБКА: массив не должен содержать нулевые значения Состояние SQL: 22004
3. Вы можете легко добавить фильтр «ГДЕ session_os НЕ РАВЕН нулю» перед группировкой: dbfiddle.uk /…
4. Почему это не позволяет мне также получать значения NULL? Если я использую «ГДЕ session_os РАВНО НУЛЮ» и ИМЕЮ ARRAY_AGG(session_os) amp;amp; ARRAY[‘Android’]. Это вызывает ту же ошибку. Я не могу этого сделать. Я не могу получить нулевые значения?
5. Смотрите это dbfiddle.uk /… . Мой случай такой… в этом случае я также могу получить нулевые значения.