在SQLite中计算多个聚合时,我可以消除子查询吗?

时间:2017-06-15 23:00:50

标签: sqlite subquery aggregate-functions

我目前正在查看SQLite 3.8.7.1(Debian Jessie)中的评级数据库,而且我有一些难以从单个查询中获取我想要的聚合以返回到Web应用程序。

通过我在大学和大量文档中对SQL类的记忆进行疏导,我有一个查询可以查找总评分,以及每个评分项目的正负计数,但我不相信我有这是一种明智的方式,或者它会变得特别有效。

<{1}}上的sqlfiddle.com <{3}}

基本上我有一个项目密钥,然后是评分它的人的用户名,在所有情况下当前设置为NULL的语言字段,评分日期以及1或{{1}在值字段中。我想返回一个包含所有项目的表格,其中列表包含正面评级数,负面评级数和总体评分(正面减去负数)。

我可以以某种方式删除子查询或使它们更有效吗?我可以在SQLite中采用其他方法吗?

实际上,我的查询返回总负面评分的负数;我可以这样做吗?

1 个答案:

答案 0 :(得分:0)

以下是基于汇总功能的提案 在具有双键group-by的公用表表达式的基础上。

我更改了负数的值,表示为正数,
但当然他们被认为是消极的 我也避免使用“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

您可能会将公用表表达式计为一个子查询,但它只有一个 有意义地测试速度可能需要数据库的全部内容,而不是小小提琴。