如何使用子查询中的 SUM(...) 列将“行位置”添加到查询中?

Posted

技术标签:

【中文标题】如何使用子查询中的 SUM(...) 列将“行位置”添加到查询中?【英文标题】:How can I add "row position" to a query with a SUM(…) column from subquery? 【发布时间】:2016-03-27 06:55:31 【问题描述】:

当我尝试在子查询中获取 SUM(...) 列然后获取行“索引”时,我遇到了一个奇怪的错误:

WITH lb(displayName, val) AS (
    SELECT user.displayName, SUM(stats.weight) AS val FROM stats
    LEFT OUTER JOIN user ON user.id = stats.userId
    GROUP BY user.id
    ORDER BY val DESC
)
SELECT displayName, val, (SELECT COUNT(*) FROM lb b WHERE a.val <= b.val) AS position FROM lb a

我在SQLiteBrowser 中运行它时遇到的错误是: misuse of aggregate: SUM(): 后跟查询的全文。

但是,如果我满足以下任一条件,查询就可以正常工作:

从最终的 SELECT 中删除 , (SELECT COUNT(*) FROM lb b WHERE a.val &lt;= b.val) AS position; 不要使用 SUM。

(但我都需要)

这是(工作)示例(sqlfiddle),其中缺少行索引(它还包括一些测试数据): http://sqlfiddle.com/#!5/b1cc3/1/0

我怎样才能修复它,让它工作(也就是说,将行号添加到结果集中)?

我需要这些索引,因为我要在这个查询之后添加一个 WHERE 子句,并且我需要知道保留的行的顺序。

例如,上面小提琴中的测试数据想要的结果是:

| displayName |  val | position |
|-------------|------|----------|
|       name2 | 1256 |        1 |
|       name4 |  133 |        2 |
|       name5 |   62 |        3 |
|       name3 |   43 |        4 |

(位置也可以从0开始,不重要)

附:用其他东西替换 SQL 实现(SQLite)不是一种选择(至少现在不是)

【问题讨论】:

为我工作 (3.8.12)。请注意,ORDER BY 必须在外部查询中。 @CL。我尝试将 ORDER BY 移动到外部查询,查询仍然中断,并出现同样的错误。让我检查一下版本... 我第一条评论的两句话是独立的。 @CL。我尝试使用命令行 sqlite3 并且它有效。那么,sqlfiddle 和 sqlitebrowser 都在使用过时的实现吗?也谢谢你的提示。 没有它,数据库可以优化外部查询以改变顺序。 【参考方案1】:

感谢CL. 的 cmets,很明显该查询正在使用更新版本的 SQLite。

所以问题很可能是 sqlitebrowser(以及 sqlfiddle)使用了过时的 SQLite 版本。 (关于这个问题我打开an issue in sqlitebrowser repository)

【讨论】:

以上是关于如何使用子查询中的 SUM(...) 列将“行位置”添加到查询中?的主要内容,如果未能解决你的问题,请参考以下文章

Group BY 子查询返回多于 1 行

java MySQL数据库编程 第四章 高级查询

查询优化,(子查询)(sql-transact)

如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?

如何更新子查询中的更多行?

Postgres 中的子查询根据 sum 函数给出不正确的结果