Я хочу получить все значения 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'}
Привет Спасибо за быстрый ответ. Я обновил свой вопрос. Пожалуйста, проверьте еще раз.
что такое quote_literal(). Пожалуйста, покажите данные перед группировкой
quote_literal() Ничего. Вы можете игнорировать это. Просто добавьте кавычку ('') к каждому значению.
Пожалуйста, проверьте обновленный вопрос.
SELECT
id,
ARRAY_AGG(session_os)
FROM
t
GROUP BY id
HAVING ARRAY_AGG(session_os) && ARRAY['Android']
Ваша проблема в том, что вы СНАЧАЛА фильтруете записи с помощью session_os = Android
. И после этого вы агрегируете их.
Вы должны сначала агрегировать, а затем заглянуть в агрегат массива, если Android является элементом. Это можно сделать с помощью предложения HAVING
и оператора &&
, который возвращает true, если два массива содержат одинаковые элементы.
Привет, спасибо Это работает. Есть еще одна проблема. Что делать, если в ARRAY_AGG(session_os) есть нулевое значение?. Выдает ошибку. ОШИБКА: массив не должен содержать нули Состояние SQL: 22004
Привет, спасибо Это работает. Есть еще одна проблема. Что делать, если в ARRAY_AGG(session_os) есть нулевое значение?. Выдает ошибку. ОШИБКА: массив не должен содержать нули Состояние SQL: 22004
Вы можете легко добавить фильтр «ГДЕ session_os НЕ NULL» перед группировкой: dbfiddle.uk/…
Почему это не позволяет мне также получать значения NULL? Если я использую «ГДЕ session_os IS NULL» и HAVING ARRAY_AGG(session_os) && ARRAY['Android']. Он снова выдает ту же ошибку. Я не могу этого сделать. Я не могу получить значения NULL?
Смотрите это dbfiddle.uk/… . Мой случай такой... в этом случае, как я могу получить нулевые значения.
Я создал новую задачу stackoverflow.com/questions/65308754/…
а) Пожалуйста, сократите свой примерный код до абсолютно необходимых частей, которые имеют отношение к описанию вашей проблемы. т.е. Я думаю, нет необходимости показывать нам 3 или 4 объединения. б) Пожалуйста, добавьте некоторые образцы данных и ожидаемый результат, чтобы мы могли воспроизвести вашу проблему.