我正在做一个概率计算。我有一个查询来计算事件发生的总数。从这些事件中,我想获得子事件发生的次数。查询以获取事件总数为25行,我不想复制并粘贴两次。
我想对该查询做两件事:计算其中的行数,并计算此查询的查询结果中的行数。现在,我能想到的唯一方法是(用复杂的查询替换@ total @来获取所有行,并用不那么复杂的条件替换@ conditions @,而来自@ total @的行必须匹配子事件):
SELECT (SELECT COUNT(*) FROM (@total@) AS t1 WHERE @conditions@) AS suboccurs, COUNT(*) AS totaloccurs FROM (@total@) as t2
如您所见,@ total @重复两次。有没有办法解决?有没有更好的方法来做我想做的事情?
要再次强调:@ conditions @确实取决于@ total @的返回值(它确实类似于t1.foo = bar)。
t1.foo = bar
最后一些注意事项:@ total @本身需要〜250ms。这个更复杂的查询需要300毫秒左右的时间,因此postgres可能会自己进行一些优化。仍然,查询看起来非常丑陋,@ total @确实被粘贴了两次。
SELECT COUNT(*) as totaloccurs, COUNT(@conditions@) as suboccurs FROM (@total@ as t1)