我正在进行概率计算.我有一个查询来计算事件发生的总次数.从这些事件中,我想得到子事件发生的次数.获取总事件的查询长度为25行,我不想只复制+粘贴两次.
我想对此查询执行两项操作:计算其中的行数,并计算此查询的查询结果中的行数.现在,我能想到的唯一方法就是这样做(用复杂的查询替换@ total @来获取所有行,而@ conditions @用不太复杂的条件替换来自@ total @的行必须匹配子事件):
SELECT (SELECT COUNT(*) FROM (@total@) AS t1 WHERE @conditions@) AS suboccurs, COUNT(*) AS totaloccurs FROM (@total@) as t2
如你所知,@ total @重复两次.有没有办法解决?有没有更好的方法来做我想做的事情?
重新强调:@condition @取决于@otal @返回的内容(它确实如此t1.foo = bar
).
最后的一些注意事项:@ total @本身需要~250ms.这个更复杂的查询需要大约300毫秒,因此postgres可能会进行一些优化.尽管如此,查询看起来非常难看,@ total @字面上粘贴了两次.
如果你的sql支持子查询因子分解,那么使用WITH语句重写它是一个选项.它允许子查询多次使用.使用它将它们创建为Oracle中的内联视图或临时表.
这是一个人为的例子.
WITH x AS ( SELECT this FROM THERE WHERE something is true ), y AS ( SELECT this-other-thing FROM somewhereelse WHERE something else is true ), z AS ( select count(*) k FROM X ) SELECT z.k, y.*, x.* FROM x,y, z WHERE X.abc = Y.abc