在 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.com
和http://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 中计算多个聚合时可以消除子查询吗?的主要内容,如果未能解决你的问题,请参考以下文章