Получить единую запись для каждого ID от союза - PullRequest
0 голосов
/ 25 июня 2018

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

У меня есть два sql-запроса select - первый проверяет, есть ли у клиента запланированный текст, а второй получает значение по умолчанию.

SELECT
            id, cust_id
        FROM
            texts
        WHERE
            over18 = FALSE
            AND now()
            BETWEEN ad_start_date
            AND ad_end_date)
    UNION ALL (
        SELECT
            id, cust_id
        FROM
            texts
        WHERE
            over18 = FALSE
            AND texts.default = TRUE
        ORDER BY
            created_at DESC)

Проблема заключается в том, что второй выбор возвращает более одногозапись для каждого cust_id.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы, кажется, хотите distinct on:

SELECT DISTINCT ON (cust_id) id, cust_id
FROM texts
WHERE over18 = FALSE AND
      (now() BETWEEN ad_start_date AND ad_end_date OR
       texts.default = TRUE
      )
ORDER BY cust_id,
         ( now() BETWEEN ad_start_date AND ad_end_date )::int desc,
         created_at DESC;
0 голосов
/ 25 июня 2018

Если вам нужен результат, основанный на множестве, тогда вы должны использовать UNION вместо UNION ALL.Подробнее об их различиях вы можете прочитать здесь .Другим способом было бы использование предложения DISTINCT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...