【问题标题】:Cumulative Sum Partition by Order by SQLite3SQLite3按顺序的累积和分区
【发布时间】:2020-08-11 15:24:20
【问题描述】:

我正在尝试对一些游乐设施数据进行会话化,并且我为每个游乐设施创建了一个标志(每一行都是此数据集中的一个游乐设施)。我制作了一个名为flags 的表格,看起来像这样:

ride_id | rider_id | ride_request_datetime | rider_request_number | new_booking_flag
-------------------------------------------------------------------------------------
100       Sue        2019-05-09 05:27:00      1                     1
101       Sue        2019-05-09 05:27:18      2                     0
102       Sue        2019-05-10 11:00:09      3                     1
203       Joe        2020-03-09 05:27:18      1                     1
204       Joe        2020-03-09 05:36:00      2                     0

根据ride_request_datetime 的一些标准,我创建了new_booking_flag 列。现在,我想对 new_booking_flag 上的值求和,按 Rider_id 分区并按 Rider_request_number 排序——以获得代表“booking_request_number”的列

我试过以下代码:

select
  ride_id,
  rider_id,
  ride_request_datetime,
  rider_request_number,
  new_booking_flag,
  sum(new_booking_flag) over (partition by rider_id order by rider_request_number)
from flags
limit 50;

SQLite3 给了我这个错误: Error: near "(": syntax error

【问题讨论】:

  • 您的 SQLite 版本是否至少为 3.25.0?
  • SQLite 版本为:3.31.1 DB-API 版本为:2.6.0
  • 你有最新版本的 SQLite,所以问题出在其他地方,而不是在这个查询中。

标签: sql database sqlite select window-functions


【解决方案1】:

您的查询是正确的并且应该可以工作,前提是您针对支持窗口函数的 SQLite 数据库运行它(它们是在 3.25 版中引入的)。

在早期版本中,一种选择是使用相关子查询来模拟窗口总和:

select
    ride_id,
    rider_id,
    ride_request_datetime,
    rider_request_number,
    new_booking_flag,
    (   
        select sum(f1.new_booking_flag) 
        from flags f1 
        where 
            f1.rider_id = f.rider_id 
            and f1.rider_request_number <= f.rider_request_number
    ) booking_request_number
from flags f
limit 50;

对于此查询的性能,请考虑在(rider_id, rider_request_number, new_booking_flag) 上建立索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2021-06-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多