Fungsi Ruang Android + Jendela

Saya mencoba menggunakan Fungsi Jendela di Kueri Ruangan. Parser mengeluh tentang pertanyaan saya. Saya hanya mencoba menambahkan ekspresi "ROW_NUMBER() OVER (ORDER BY kolom)" dalam pernyataan pilihan saya. Tanpa ekspresi ini, kueri berjalan dengan benar.

Kesalahan pengurai:

extraneous input '(' expecting {<EOF>, ';', ',', K_ALTER, K_ANALYZE, 
K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP, 
K_END, K_EXCEPT, K_EXPLAIN, K_FROM, K_GROUP, K_INSERT, K_INTERSECT, 
K_LIMIT, K_ORDER, K_PRAGMA, K_REINDEX, K_RELEASE, K_REPLACE, 
K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UNION, K_UPDATE, K_VACUUM, 
K_VALUES, K_WHERE, K_WITH, UNEXPECTED_CHAR}
mismatched input ')' expecting {<EOF>, ';', ',', '=', '*', '+', '-', 
'||', '/', '%', '<<', '>>', '&', '|', '<', '<=', '>', '>=', '==', '!=', 
'<>', K_ALTER, K_ANALYZE, K_AND, K_ASC, K_ATTACH, K_BEGIN, K_BETWEEN, 
K_COLLATE, K_COMMIT, K_CREATE, K_DELETE, K_DESC, K_DETACH, K_DROP, 
K_END, K_EXPLAIN, K_GLOB, K_IN, K_INSERT, K_IS, K_ISNULL, K_LIKE, 
K_LIMIT, K_MATCH, K_NOT, K_NOTNULL, K_OR, K_PRAGMA, K_REGEXP, 
K_REINDEX, K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, 
K_UPDATE, K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR}
extraneous input ')' expecting {<EOF>, ';', ',', K_ALTER, K_ANALYZE, 
K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP, 
K_END, K_EXPLAIN, K_INSERT, K_LIMIT, K_PRAGMA, K_REINDEX, K_RELEASE, 
K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE, K_VACUUM, 
K_VALUES, K_WITH, UNEXPECTED_CHAR} extraneous input 'add_permutation' 
expecting {<EOF>, ';', ',', '=', '*', '+', '-', '||', '/', '%', '<<', 
'>>', '&', '|', '<', '<=', '>', '>=', '==', '!=', '<>', K_ALTER, 
K_ANALYZE, K_AND, K_ASC, K_ATTACH, K_BEGIN, K_BETWEEN, K_COLLATE, 
K_COMMIT, K_CREATE, K_DELETE, K_DESC, K_DETACH, K_DROP, K_END, 
K_EXPLAIN, K_GLOB, K_IN, K_INSERT, K_IS, K_ISNULL, K_LIKE, K_LIMIT, 
K_MATCH, K_NOT, K_NOTNULL, K_OR, K_PRAGMA, K_REGEXP, K_REINDEX, 
K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE, 
K_VACUUM, K_VALUES, K_WITH, UNEXPECTED_CHAR}

person Jerome Dupont    schedule 08.03.2019    source sumber


Jawaban (3)


Ruang Android tidak akan menggunakan versi SQLite yang menyertakan Fungsi Windows yang memerlukan SQLite 3.25.0 atau lebih tinggi, sesuai :-

Dukungan fungsi jendela telah ditambahkan ke SQLite dengan rilis versi 3.25.0 (15-09-2018). Pengembang SQLite menggunakan dokumentasi fungsi jendela PostgreSQL sebagai referensi utama mereka tentang bagaimana seharusnya fungsi jendela berperilaku. Banyak kasus pengujian telah dijalankan terhadap PostgreSQL untuk memastikan bahwa fungsi jendela beroperasi dengan cara yang sama di SQLite dan PostgreSQL. Fungsi Jendela

Android API 28 terbaru tampaknya menggunakan 3.19 karena tidak tercantum di android. database.sqlite, sehingga penggunaannya sama dengan API 27.

Dengan demikian, SQLite melihat klausa yang tidak diketahui sebagai kesalahan sintaksis.

person MikeT    schedule 08.03.2019
comment
Terima kasih Mike atas penjelasannya, masuk akal. - person Jerome Dupont; 20.03.2019
comment
@JeromeDupont Apa solusinya? - person Jaimin Modi; 09.06.2021

Ini adalah kesalahan Sintaks dalam Kueri SQL Anda.

Pastikan saat Anda membuat Kueri, beri spasi di akhir setiap baris.

person Amit raj    schedule 25.06.2020

Memang versi SQLite yang tertanam di Android belum menyediakan fungsi jendela. Tapi saya ingin memposting solusi yang terinspirasi oleh pertanyaan ini: Cara menggunakan ROW_NUMBER di sqlite, jika ada orang lain yang mengalami masalah ini di Android.

Misalnya dalam hubungan ini:

| id | value | updated_at                     |
-----------------------------------------------
| 1  | yes   | 2020-11-26 11:27:45.662 +00:00 |
| 3  | yes   | 2020-11-27 17:19:45.662 +00:00 |
| 4  | yes   | 2020-11-26 11:21:45.662 +00:00 |
| 6  | no    | 2020-11-26 14:42:45.662 +00:00 |
| 9  | yes   | 2020-11-27 15:08:45.662 +00:00 |
-----------------------------------------------

Anda dapat menggunakan kueri ini untuk hanya mengurutkan baris 'ya' berdasarkan kolomupdate_at yang terkait dengan nomor baris:

SELECT
    id,
    value,
    (
        SELECT
            count(*)
        FROM
            tbl b
        WHERE
            a.updated_at >= b.updated_at
            AND value = 'yes'
    ) AS row_num,
    updated_at
FROM
    tbl a
WHERE
    value = 'yes'
ORDER BY updated_at

Ini menghasilkan hasil sebagai berikut:

| id | value | row_num | updated_at                     |
---------------------------------------------------------
|  4 |   yes |   1     | 2020-11-26 11:21:45.662 +00:00 |
|  1 |   yes |   2     | 2020-11-26 11:27:45.662 +00:00 |
|  9 |   yes |   3     | 2020-11-27 15:08:45.662 +00:00 |
|  3 |   yes |   4     | 2020-11-27 17:19:45.662 +00:00 |
---------------------------------------------------------

Berhati-hatilah karena klausa OVER (ORDER BY updated_at) yang biasanya ada dalam fungsi jendela ROW_NUMBER digantikan di sini dengan klausa WHERE a.updated_at >= b.updated_at dari sub-kueri yang menghasilkan kolom row_num. Anda juga perlu memfilter baris subkueri ini seperti yang Anda lakukan di kueri utama, jika tidak, nomor baris akan memperhitungkan semua baris tabel dan Anda tidak akan mendapatkan hasil yang diharapkan. Itu adalah bagian AND value = 'yes' dari kueri.

person Nicolas Prugne    schedule 05.12.2020