Android SQLite получает максимальное значение по отношению к другим столбцам - PullRequest
0 голосов
/ 07 января 2020

У меня есть таблица с именем 'tracked_exercises', которая содержит столбцы, показанные на прилагаемом рисунке (имя упражнения, группа, повторы, килограммы)

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

  • Максимальное количество повторений с каждой уникальной полосой
  • Максимальное количество килограммов на каждом повторении с соответствующей полосой (но не если максимальные килограммы меньше или равны максимальным килограммам с более высокими повторениями. Поэтому, если у вас есть 2 повторения с 6 кг и 3 повторения с 6 кг, я не хочу, чтобы 2 повторения с 6 кг возвращались)

Так что в примере изображения, если я даю 'Muscle Up' Я хотел бы получить обратно

   | band   | reps | kgs |
   | red    | 10   | 0   |
   | purple | 15   | 0   |
   | No     | 5    | 0   |
   | No     | 4    | 10  |
   | No     | 2    | 15  |

Мне удалось получить максимальное количество повторений для каждой уникальной группы с помощью приведенного ниже запроса, но мне так и не удалось выяснить, как получить строки с максимальными килограммами

@Query("SELECT * FROM tracked_exercises INNER JOIN (SELECT band, MAX(reps) AS Maxreps FROM tracked_exercises WHERE exercise_name =:name GROUP BY band ) topset ON tracked_exercises.band = topset.band AND tracked_exercises.reps = topset.Maxreps")
List<TrackedExercise> getPersonalRecords(String name);

Извините, если это не ясно, прокомментируйте, если вам нужна дополнительная информация

Пример таблицы отслеживаемых упражнений

Другой пример:

| band  | reps | kgs |
| No    | 3    | 2.5 |
| No    | 3    | 5   |
| No    | 3    | 6.25|
| No    | 10   | 0   |
| No    | 9    | 0   |
| No    | 4    | 5   |
| No    | 4    | 3.75|
| red   | 11   | 0   |
| red   | 10   | 0   |
| No    | 2    | 6.25|

Мне бы хотелось получить результат:

| band  | reps | kgs |
| No    | 10   | 0   |
| red   | 11   | 0   |
| No    | 3    | 6.25|
| No    | 4    | 5   |

Редактировать: обновлен вопрос, чтобы сделать его более понятным

1 Ответ

0 голосов
/ 07 января 2020

Используйте CTE, чтобы получить все максимумы для reps и kgs, а затем NOT EXISTS для результатов:

with cte as (
  select t.band, t.reps, t.kgs
  from ( 
    select *,
      row_number() over (partition by band order by reps desc) rnreps,
      row_number() over (partition by band, reps order by kgs desc) rnkgs
    from tracked_exercises
  ) t  
  where t.rnreps = 1 or t.rnkgs = 1
)  
select c.* from cte c
where not exists (
  select 1 from cte
  where band = c.band and reps > c.reps and kgs >= c.kgs
)

См. Демоверсию . Результаты:

| band | reps | kgs  |
| ---- | ---- | ---- |
| No   | 10   | 0    |
| No   | 4    | 5    |
| No   | 3    | 6.25 |
| red  | 11   | 0    |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...