Кумулятивная сумма Разделение по порядку по SQLite3 - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь сессионизировать некоторые данные поездок, и я создал флаг для каждой поездки (каждая строка является поездкой в ​​этом наборе данных). Я создал таблицу с именем 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

1 Ответ

2 голосов
/ 28 апреля 2020

Ваш запрос правильный и должен работать при условии, что вы запускаете его для базы данных 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).

...