Расчеты PostgreSQL с использованием значений подвыбора - PullRequest
0 голосов
/ 26 апреля 2018

Используя PostgreSQL 9.3, я пытаюсь вычислить некоторые значения на основе результатов отборов из нашей таблицы электронной почты. Вот что я хочу сделать , что, конечно, приводит к ошибке SQL, поскольку вы не можете ссылаться на значения псевдонима в SELECT:

SELECT 
    email.key,
    email.col1,
    email.col2,
    (SELECT count(sent.subscriber_key) FROM sent WHERE sent.email_id = email.key) AS sent_count,
    (SELECT count(bounce.subscriber_key) FROM bounce WHERE bounce.email_id = email.key) AS bounce_count,
    ((bounce_count / sent_count) * 100) as bounce_pct
FROM
    email
ORDER BY 
    email.key

Я попытался переместить логику выбора в предложение WITH:

WITH
    sent_tmp AS (SELECT count(sent.subscriber_key) as count FROM sent INNER JOIN email ON sent.send_id = email.key),
    bounce_tmp AS (SELECT count(bounce.subscriber_key) as count FROM bounce INNER JOIN email ON bounce.send_id = email.key)
SELECT 
    email.key,
    email.col1,
    email.col2,
    email.sent_date,
    sent_tmp.count,
    bounce_tmp.count,
    ((bounce_tmp.count / sent_tmp.count) * 100) as bounce_pct
FROM
    email,
    sent_tmp,
    bounce_tmp
ORDER BY 
    email.key

... и я попытался переместить его в предложение FROM:

SELECT 
    email.key,
    email.col1,
    email.col2,
    sent_count,
    bounce_count,
    ((bounce_count / sent_count) * 100) as bounce_pct
FROM
    email,
    (SELECT count(sent.subscriber_key) FROM sent INNER JOIN email ON sent.send_id = email.key) AS sent_count,
    (SELECT count(bounce.subscriber_key) FROM bounce INNER JOIN email ON bounce.send_id = email.key) AS bounce_count
ORDER BY 
    email.key

... но в любом случае получаются неверные отправленные и ненадежные номера . (Все цифры одинаковы для каждого электронного письма.) Я, вероятно, не понимаю порядок выполнения синтаксиса запросов PostgreSQL, или подселекты не оцениваются для каждой строки результатов таблицы электронной почты.

Если кто-то может указать мне правильное направление и сообщить, что возможно, это будет оценено! Я пропускаю какой-то ключевой синтаксис при перемещении логики подбора в WITH или FROM? Нужно ли использовать именованные переменные? Функции?

Я понимаю, что можно добавить еще одну подвыборку, которая будет пересчитывать столбец subscriber_key в таблицах send и bounce, но я пытаюсь избежать пересчета ради эффективности. (И читабельность, в этом отношении.)

1 Ответ

0 голосов
/ 26 апреля 2018

Простым решением является вычисление значения во внешнем запросе:

SELECT key, col1, col2, sent_count, bounce_count,
       100.0 * bounce_count / sent_count AS bounce_pct
FROM (SELECT key, col1, col2,
            (SELECT count(sent.subscriber_key)
             FROM sent
             WHERE sent.email_id = email.key
            ) AS sent_count,
            (SELECT count(bounce.subscriber_key)
             FROM bounce
             WHERE bounce.email_id = email.key
            ) AS bounce_count
      FROM email
     ) q
ORDER BY key;
...