SQLite - 如何使用 ROW_NUMBER() OVER
Posted
技术标签:
【中文标题】SQLite - 如何使用 ROW_NUMBER() OVER【英文标题】:SQLite - How to use ROW_NUMBER() OVER 【发布时间】:2021-02-12 05:39:54 【问题描述】:我想从我的数据库中获取有关某些挑战的连续性的信息。我在 sqliteonline.com 中尝试了我的所有查询,因此我找到了一个满足我获取这些信息的要求的查询:
select challengeid, min(date) as min_date, max(date) as max_date, count(*) as length from (select t.*, row_number() over (partition by challengeid order by date) as seqnum from ACTIVE_CHALLENGES_TABLE t) t group by challengeid, date(date, '-' || seqnum || ' day') HAVING challengeid = 4 AND value != 0
在 sqliteonline.com 上一切正常,但在 android Studio 中出现以下错误:
android.database.sqlite.SQLiteException: near "(": syntax error (code 1): , while compile: select challengeid, min(date) as min_date, max(date) as max_date, count() as length from (select t., row_number() over (partition by challengeid order by date) as seqnum from ACTIVE_CHALLENGES_TABLE t) t group by challengeid, date(date, '-' || seqnum || 'day' ) HAVING challengeid = 4 AND value != 0
我已经尝试找出导致错误的原因。在整个测试过程中我发现它可能是使用这个sn-p:SELECT row_number() OVER (challengeid) seqnum from ACTIVE_CHALLENGES_TABLE
我不知道我应该做什么。你能帮帮我吗?
【问题讨论】:
您使用的是不支持窗口函数的旧版 SQLite 吗? 版本为3.9.2 那已经很老了。您可能应该升级数据库。 【参考方案1】:如果您的 SQLite 版本不支持窗口函数,您可以使用相关子查询来获取列 seqnum
:
select challengeid, min(date) as min_date, max(date) as max_date, count(*) as length
from (
select t.*,
(
select count(*) + 1 from ACTIVE_CHALLENGES_TABLE
where challengeid = t.challengeid
and (date < t.date or (date = t.date and rowid < t.rowid))
) as seqnum
from ACTIVE_CHALLENGES_TABLE t
where t.challengeid = 4 and t.value != 0
)
group by challengeid, date(date, '-' || seqnum || ' day')
请注意,我删除了 HAVING
子句,这没有意义,因为它不会过滤掉任何聚合列,我将其替换为子查询中的 WHERE
子句,因为您只需要以下条件下的结果:
challengeid = 4 and value != 0
【讨论】:
以上是关于SQLite - 如何使用 ROW_NUMBER() OVER的主要内容,如果未能解决你的问题,请参考以下文章