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

Posted

技术标签:

【中文标题】在 SQLite 中计算多个聚合时可以消除子查询吗?【英文标题】:Can I eliminate subqueries when calculating multiple aggregates in SQLite? 【发布时间】:2017-11-18 14:00:00 【问题描述】:

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

通过我对大学 SQL 课程的记忆和大量文档进行挖掘,我有一个查询可以找到总评分,以及每个被评分项目的正负计数,但我不相信我已经得到一种明智的做法,或者说它会特别有效。

裸骨在sqlfiddle.comhttp://www.sqlfiddle.com/#!7/a71acb/1

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

我可以以某种方式删除子查询或提高它们的效率吗?我可以在 SQLite 中采用其他方法吗?

实际上,我的查询返回的总负面评分为负数;我可以把它变成积极的吗?

【问题讨论】:

【参考方案1】:

这是一个基于聚合函数的提案 基于具有两键 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

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

【讨论】:

以上是关于在 SQLite 中计算多个聚合时可以消除子查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite:在子查询“消除”结果中排序

当我在 R 中使用聚合时,我可以将总和应用于每一行吗?

DB2 - 在光标中聚合大小写

当域事件影响同一有界上下文中的多个聚合时,EventSourcing中的StreamId是什么?

Hive 在使用 case 语句和聚合时按列分组出错

将 DISTINCT 与多个条件聚合一起使用(注释)