Я делаю расчет вероятности. У меня есть запрос для расчета общего числа случаев, когда событие происходит. Из этих событий я хочу узнать, сколько раз происходит подэвент. Запрос для получения общего количества событий составляет 25 строк, и я не хочу просто копировать + вставлять его дважды.
Я хочу сделать с этим запросом две вещи: вычислить количество строк в нем и вычислить количество строк в результате запроса по этому запросу. Сейчас я могу думать только об этом (замените @ total @ сложным запросом для получения всех строк, а @ condition @ - менее сложными условиями, которым должны соответствовать строки из @ total @ подэвент):
SELECT (SELECT COUNT(*) FROM (@total@) AS t1 WHERE @conditions@) AS suboccurs,
COUNT(*) AS totaloccurs FROM (@total@) as t2
Как вы заметили, @ total @ повторяется дважды. Есть ли способ обойти это? Есть ли лучший способ сделать то, что я пытаюсь сделать?
Чтобы еще раз подчеркнуть: @ условие @ зависит от того, что @ total @ возвращает (это такие вещи как t1.foo = bar
).
Несколько заключительных замечаний: @ total @ само по себе занимает ~ 250 мс. Этот более сложный запрос занимает ~ 300 мс, поэтому postgres, вероятно, сам выполняет некоторую оптимизацию. Тем не менее, запрос выглядит ужасно уродливо, когда @ total @ буквально вставлен дважды.