在SQLite中计算多个聚合时,是否可以消除子查询?
我目前正在查看SQLite 3.8.7.1(Debian Jessie)中的评级数据库,我很难从一个查询中获得想要返回到web应用程序的聚合 翻阅我对uni的SQL类的记忆和大量文档,我得到了一个查询,可以找到总评分,加上每个被评分项目的正负计数,但我不相信我有一个明智的方法来做这件事,或者它会特别有效 最基本的部分在在SQLite中计算多个聚合时,是否可以消除子查询?,sqlite,subquery,aggregate-functions,Sqlite,Subquery,Aggregate Functions,我目前正在查看SQLite 3.8.7.1(Debian Jessie)中的评级数据库,我很难从一个查询中获得想要返回到web应用程序的聚合 翻阅我对uni的SQL类的记忆和大量文档,我得到了一个查询,可以找到总评分,加上每个被评分项目的正负计数,但我不相信我有一个明智的方法来做这件事,或者它会特别有效 最基本的部分在sqlfiddle.comas上 基本上,我有一个项目键,然后是评分人的用户名,在所有情况下当前设置为NULL的语言字段,评分日期,以及值字段中的1或-1。我想返回一个包含所有项目
sqlfiddle.com
as上
基本上,我有一个项目键,然后是评分人的用户名,在所有情况下当前设置为NULL
的语言字段,评分日期,以及值字段中的1
或-1
。我想返回一个包含所有项目的表,其中包含正面评级数、负面评级数和总体评级(正面减去负面)列
我能以某种方式删除子查询还是使它们更有效?我可以在SQLite中采用其他方法吗
实际上,我的查询返回一个负数表示总的负面评级;我能肯定这一点吗?这是一个基于聚合函数的提案
在一个公共表表达式的基础上,用“< /代码>”编写两个键<代码>组。 我将负片的值更改为正数,
当然,它们被算作负数。
我还避免了“NULL”条目,因为它们很难看,而且它还确保min/max返回其边0或0。
否则,我相信结果就是期望的输出
with subtotals(titem, subtotal) as
(select item
, sum(value)
from ratings
group by item, value)
select titem as item
, sum(subtotal) as total
, max(0, max(subtotal)) as pos
, -1*min(0, min(subtotal)) as neg
from subtotals
group by titem;
输出(.width 20
,.headers on
,.mode columns
):
您可能会将公共表表达式计算为一个子查询,但它只是一个子查询。对速度进行有意义的测试可能需要数据库的全部内容,而不是很小的麻烦
item total pos neg
-------------------- ---------- ---------- ----------
africa 1 2 1
cant-buy-me-love 3 3 0
happy-together -2 0 2
solitaire 0 1 1