Android Room Database Query поддерживает row_number? - PullRequest
3 голосов
/ 14 января 2020

Я пытаюсь заставить следующий sqlite-запрос работать в моей базе данных android, но он жалуется на пару ошибок.

@Query("with cte as (\n" +
        "  select t.exercise_name,t.band, t.reps, t.weight\n" +
        "  from ( \n" +
        "    select *,\n"+      "" +
        "      row_number() over (partition by band order by reps desc) rnreps,\n" +
        "      row_number() over (partition by band, reps order by weight desc) rnweight" +
        "    from tracked_exercises\n" +
        "  ) t  \n" +
        "  where exercise_name = :name\n" +
        ")  \n" +
        "select * from cte c\n" +
        "where not exists (\n" +
        "  select 1 from cte\n" +
        "  where band = c.band and reps > c.reps and weight >= c.weight\n" +
        ")  \n")
List<TrackedExercise> getPersonalRecords(String name);

1 как раз перед скобкой перед разделом "<compound operator>, FROM, GROUP, LIMIT, ORDER, WHERE or comma expected, got '('"

И еще, когда я пытаюсь скомпилировать "error: no viable alternative at input 'with cte as...."

Мне удалось получить тот же запрос, работающий на скрипке здесь

Является ли row_number() over (partition' предложение не поддерживается Room или я что-то упустил?

EDIT: только что нашел Android Room + Window Functions похоже, что эта функция доступна только в SQLite 3.25 и выше Android только идет до 3.19. Мне все еще интересно, есть ли у кого-нибудь идеи о том, как создать запрос, который делает то же самое без использования Windows Функции

1 Ответ

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

Я думаю, что нашел решение своей проблемы, используя 2 CTE, затем соединив результаты

@Query("-- gets the max reps at each set of exercise_name, band, weight\n" +
        "with repsCTE as (\n" +
        "  select *,max(reps) reps\n" +
        "  from tracked_exercises\n" +
        "  where exercise_name = :name\n" +
        "  group by exercise_name, band, weight ), \n" +
        "\n" +
        "-- gets the max weight at each set of exercise_name, band, reps\n" +
        "weightCTE as (\n" +
        "  select *,max(weight) weight\n" +
        "  from tracked_exercises\n" +
        "  where exercise_name = :name\n" +
        "  group by exercise_name, band, reps ) \n" +
        "\n" +
        "select * \n" +
        "from repsCTE r join weightCTE w\n" +
        "on r.id = w.id\n" +
        "order by band,reps" )
List<TrackedExercise> getPersonalRecords(String name);

Fiddle

...