【问题标题】:Sqlite, SELECT DISTINCT get multiple last rowsSqlite,SELECT DISTINCT 获取多个最后一行
【发布时间】:2020-12-03 19:37:52
【问题描述】:

只是无法弄清楚这个 SQLite 查询出了什么问题。

我有这样的 ACCOUNTS 表

subscr_id,txn_type,PAYMENT_START
A,        signup,  1
A,        pay,     2
A,        pay,     3
A,        cancel,  4
B,        signup,  1
B,        pay,     2
B,        pay,     3

我想输出 A,cancel,4B,pay,3,(每个唯一 subscr_id 仅按时间排序的最后一个值 (PAYMENT_START))

SELECT DISTINCT subscr_id,
   LAST_VALUE(txn_type) OVER (
   PARTITION BY subscr_id ORDER BY PAYMENT_START asc
   RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS last FROM ACCOUNTS;

当我想执行这个我得到错误:

错误:“(”附近:语法错误

【问题讨论】:

  • 可能你的 SQLite 版本不支持窗口函数。
  • 我会检查一下,但同时还有其他方法可以为每个 subscr_id 选择最后一个值吗?
  • SQLite 首次添加窗口函数支持,发布版本为3.25.0 (2018-09-15)。 SQLite 开发人员使用 PostgreSQL 窗口函数文档作为窗口函数应该如何表现的主要参考。已经针对 PostgreSQL 运行了许多测试用例,以确保窗口函数在 SQLite 和 PostgreSQL 中以相同的方式运行。我的 sqlite3 版本是3.13.0

标签: sql sqlite select


【解决方案1】:

假设payment_start 没有针对给定订阅者重复,您可以使用相关子查询来做您想做的事情:

select a.*
from accounta a
where a.payment_start = (select max(a2.payment_start)
                         from accounts a2
                         where a2.subscr_id = a.subscr_id
                        )

【讨论】:

  • 我刚刚将 sqlite3 升级到 3.32.3 并且 LAST_VALUE 正在工作。为您争取时间。
猜你喜欢
  • 2011-11-26
  • 2015-09-16
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多