Получить все значения array_agg() с одним совпадающим значением Postgres

Я хочу получить все значения 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'}

а) Пожалуйста, сократите свой примерный код до абсолютно необходимых частей, которые имеют отношение к описанию вашей проблемы. т.е. Я думаю, нет необходимости показывать нам 3 или 4 объединения. б) Пожалуйста, добавьте некоторые образцы данных и ожидаемый результат, чтобы мы могли воспроизвести вашу проблему.

S-Man 14.12.2020 15:14

Привет Спасибо за быстрый ответ. Я обновил свой вопрос. Пожалуйста, проверьте еще раз.

Aman Sharma 14.12.2020 16:26

что такое quote_literal(). Пожалуйста, покажите данные перед группировкой

S-Man 14.12.2020 17:06

quote_literal() Ничего. Вы можете игнорировать это. Просто добавьте кавычку ('') к каждому значению.

Aman Sharma 14.12.2020 17:18

Пожалуйста, проверьте обновленный вопрос.

Aman Sharma 14.12.2020 17:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 712
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

демо:дб<>рабочий пример

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

Aman Sharma 15.12.2020 09:49

Привет, спасибо Это работает. Есть еще одна проблема. Что делать, если в ARRAY_AGG(session_os) есть нулевое значение?. Выдает ошибку. ОШИБКА: массив не должен содержать нули Состояние SQL: 22004

Aman Sharma 15.12.2020 09:52

Вы можете легко добавить фильтр «ГДЕ session_os НЕ NULL» перед группировкой: dbfiddle.uk/…

S-Man 15.12.2020 10:13

Почему это не позволяет мне также получать значения NULL? Если я использую «ГДЕ session_os IS NULL» и HAVING ARRAY_AGG(session_os) && ARRAY['Android']. Он снова выдает ту же ошибку. Я не могу этого сделать. Я не могу получить значения NULL?

Aman Sharma 15.12.2020 13:30

Смотрите это dbfiddle.uk/… . Мой случай такой... в этом случае, как я могу получить нулевые значения.

Aman Sharma 15.12.2020 15:33

Я создал новую задачу stackoverflow.com/questions/65308754/…

Aman Sharma 15.12.2020 16:24

Другие вопросы по теме