Альтернатива для оконной функции в версии SQLite <3.25.0? - PullRequest
0 голосов
/ 09 января 2020

Я хочу получить последние 10 строк для каждого совпадения chat_id в таблице.

Это прекрасно работает:


SELECT *
FROM 
    (SELECT a.*,
         row_number()
        OVER (PARTITION BY a.chat_id
    ORDER BY  a.timestamp DESC ) AS row
    FROM messages a ) AS foo
WHERE row <= 10

Но когда я помещаю этот код в свое приложение React Native, оно бросает и ошибка, и это потому, что это поддерживается только в SQLite 3.25.0 и выше.

https://developer.android.com/reference/android/database/sqlite/package-summary.html

Есть ли другой способ сделать это? Я пытаюсь избежать нескольких запросов к SQL.

1 Ответ

1 голос
/ 09 января 2020

Один из вариантов - использовать коррелированный подзапрос, чтобы подсчитать, сколько записей имеет тот же chat_id и больше timestamp, чем текущая строка, и использовать результат для фильтрации:

select m.*
from messages m
where (
    select count(*) 
    from messages m1 
    where m1.chat_id = m.chat_id and m1.timestamp > m.timestamp
) < 10
...