我有几个查询,其中一个查询需要有条件,另一个查询不需要条件(通常是计算<results with condition>/<all results>的比率):
<results with condition>/<all results>
-- all results select count(*) from somewhere -- filtered results select count(*) from somewhere where condition
实际的查询要长得多,有几个连接,我希望有一个能包含两种情况的查询。这可能吗?
vybvopom1#
您正在描述条件聚合。您的伪代码如下所示:
select count(*) as total, sum(case when <condition> then 1 else 0 end) as total_with_cond, avg(case when <condition> then 1.0 else 0 end) as ratio_with_cond from somewhere
其中<condition>表示要在每行上检查的 predicate 。在SQLite中,可以在数值上下文中计算 predicate ,我们可以进一步缩短语法如下:
<condition>
select count(*) as total, sum(<condition>) as total_with_cond, avg(<condition>) as ratio_with_cond from somewhere
isr3a4wc2#
上面给出的两个伪查询的简化可能是:
SELECT COUNT(CASE WHEN <condition> THEN 1 END) / COUNT(*) AS ratio FROM somewhere;
这里我们使用条件聚合来查找带有条件的计数。请注意,上面的查询只需要在表上进行一次传递,因此是高效的。
2条答案
按热度按时间vybvopom1#
您正在描述条件聚合。您的伪代码如下所示:
其中
<condition>
表示要在每行上检查的 predicate 。在SQLite中,可以在数值上下文中计算 predicate ,我们可以进一步缩短语法如下:
isr3a4wc2#
上面给出的两个伪查询的简化可能是:
这里我们使用条件聚合来查找带有条件的计数。请注意,上面的查询只需要在表上进行一次传递,因此是高效的。