Android 房间数据库查询是否支持 row_number?
Does Android Room Database Query support row_number?
我试图让以下 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...."
我已经设法让相同的查询在 fiddle here
上运行
Room 不支持 row_number() over (partition'
子句还是我遗漏了什么?
编辑:
刚刚发现这个 看起来这个函数只在 SQLite 3.25 和更高版本中可用 Android 只能达到 3.19。如果有人对如何在不使用 Windows 函数
的情况下创建执行相同操作的查询有任何想法,我仍然很感兴趣
我想我使用 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);
我试图让以下 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...."
我已经设法让相同的查询在 fiddle here
上运行Room 不支持 row_number() over (partition'
子句还是我遗漏了什么?
编辑:
刚刚发现这个
我想我使用 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);