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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sqlite 中使用 ROW_NUMBER

sqlite3 模块中的 ROW_NUMBER 函数

sqlite3模块中的ROW_NUMBER函数

Sqlite 中的 ROWNumber

sqlite 树型结构查询

如何使用 ROW_NUMBER()?