我尝试在Room查询中使用窗口函数。解析器正在抱怨我的查询。我只是尝试在select语句中添加一个"ROW_NUMBER() OVER (ORDER列)“表达式。如果没有此表达式,查询将正确运行。
解析器错误:
extraneous input '(' expecting {<EOF>, ';', ',', K_ALTER, K_ANALYZE,
K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP,
K_END, K_EXCEPT, K_EXPLAIN, K_FROM, K_GROUP, K_INSERT, K_INTERSECT,
K_LIMIT, K_ORDER, K_PRAGMA, K_REINDEX, K_RELEASE, K_REPLACE,
K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UNION, K_UPDATE, K_VACUUM,
K_VALUES, K_WHERE, K_WITH, UNEXPECTED_CHAR}
mismatched input ')' expecting {<EOF>, ';', ',', '=', '*', '+', '-',
'||', '/', '%', '<<', '>>', '&', '|', '<', '<=', '>', '>=', '==', '!=',
'<>', K_ALTER, K_ANALYZE, K_AND, K_ASC, K_ATTACH, K_BEGIN, K_BETWEEN,
K_COLLATE, K_COMMIT, K_CREATE, K_DELETE, K_DESC, K_DETACH, K_DROP,
K_END, K_EXPLAIN, K_GLOB, K_IN, K_INSERT, K_IS, K_ISNULL, K_LIKE,
K_LIMIT, K_MATCH, K_NOT, K_NOTNULL, K_OR, K_PRAGMA, K_REGEXP,
K_REINDEX, K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT,
K_UPDATE, K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR}
extraneous input ')' expecting {<EOF>, ';', ',', K_ALTER, K_ANALYZE,
K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP,
K_END, K_EXPLAIN, K_INSERT, K_LIMIT, K_PRAGMA, K_REINDEX, K_RELEASE,
K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE, K_VACUUM,
K_VALUES, K_WITH, UNEXPECTED_CHAR} extraneous input 'add_permutation'
expecting {<EOF>, ';', ',', '=', '*', '+', '-', '||', '/', '%', '<<',
'>>', '&', '|', '<', '<=', '>', '>=', '==', '!=', '<>', K_ALTER,
K_ANALYZE, K_AND, K_ASC, K_ATTACH, K_BEGIN, K_BETWEEN, K_COLLATE,
K_COMMIT, K_CREATE, K_DELETE, K_DESC, K_DETACH, K_DROP, K_END,
K_EXPLAIN, K_GLOB, K_IN, K_INSERT, K_IS, K_ISNULL, K_LIKE, K_LIMIT,
K_MATCH, K_NOT, K_NOTNULL, K_OR, K_PRAGMA, K_REGEXP, K_REINDEX,
K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE,
K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR}发布于 2019-03-08 19:37:39
Android将不会使用包含需要SQLite 3.25.0或更高版本的SQLite函数的版本,如下所示:-
窗口功能支持添加到SQLite中,版本为3.25.0 (2018-09-15)。SQLite开发人员使用PostgreSQL窗口函数文档作为窗口函数应如何运行的主要参考。许多测试用例都是针对PostgreSQL运行的,以确保窗口函数在SQLite和PostgreSQL中都以相同的方式运行。窗口函数
最新的Android 28似乎使用了3.19,因为它没有在android.database.sqlite上列出,所以它将使用与API 27相同的。
因此,SQLite将未知子句视为语法错误。
发布于 2020-12-05 11:07:46
事实上,嵌入在Android中的SQLite版本还没有提供窗口功能。但是我想发布一个灵感来自这个问题的解决方案:以平方米计的数字,如果其他人在Android上为这个问题苦苦挣扎的话。
例如,在这方面:
| id | value | updated_at |
-----------------------------------------------
| 1 | yes | 2020-11-26 11:27:45.662 +00:00 |
| 3 | yes | 2020-11-27 17:19:45.662 +00:00 |
| 4 | yes | 2020-11-26 11:21:45.662 +00:00 |
| 6 | no | 2020-11-26 14:42:45.662 +00:00 |
| 9 | yes | 2020-11-27 15:08:45.662 +00:00 |
-----------------------------------------------可以使用此查询只获取与行号关联的updated_at列排序的“是”行:
SELECT
id,
value,
(
SELECT
count(*)
FROM
tbl b
WHERE
a.updated_at >= b.updated_at
AND value = 'yes'
) AS row_num,
updated_at
FROM
tbl a
WHERE
value = 'yes'
ORDER BY updated_at它产生了以下结果:
| id | value | row_num | updated_at |
---------------------------------------------------------
| 4 | yes | 1 | 2020-11-26 11:21:45.662 +00:00 |
| 1 | yes | 2 | 2020-11-26 11:27:45.662 +00:00 |
| 9 | yes | 3 | 2020-11-27 15:08:45.662 +00:00 |
| 3 | yes | 4 | 2020-11-27 17:19:45.662 +00:00 |
---------------------------------------------------------请注意,窗口函数ROW_NUMBER中通常存在的WHERE a.updated_at >= b.updated_at子句在这里被生成row_num列的子查询的WHERE a.updated_at >= b.updated_at子句替换。此外,您需要在主查询中过滤该子查询的行,否则行号将考虑表的所有行,而不会得到预期的结果。这是查询的AND value = 'yes'部分。
发布于 2020-06-25 15:06:10
这是SQL查询.中的语法错误。
确保在形成查询时,在每一行末尾留出一个空格。
https://stackoverflow.com/questions/55067466
复制相似问题