【问题标题】:Can I eliminate subqueries when calculating multiple aggregates in SQLite?在 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 中采用其他方法吗?

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

【问题讨论】:

    标签: sqlite subquery aggregate-functions


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多