【问题标题】:How can i set a conditional limit on Log_Entries which are counted?我如何设置对被计数的 Log_Entries 的条件限制?
【发布时间】:2020-05-19 12:37:42
【问题描述】:

所以我在我的 android ROOM DAO 中有一个查询,其中我收到了锻炼完成百分比,计算如下:

(完成组/总锻炼组)* 100

但是,我遇到的问题是总锻炼集是通过对特定锻炼的每个锻炼的总目标集求和来计算的。

完成的集合是通过对每个日志条目的 COUNT 求和来计算的。因此,锻炼百分比有可能达到 100%。

此外,对于特定练习,用户可以输入比目标组更多的组。 我需要能够为每次练习计算的日志条目数量设置限制。

(日志条目表有一个 junctionID,对于每个练习都是唯一的。)

如何更改此查询以仅计算每个练习的前 3 个 logID(忽略超过此值的任何内容)?

ER Diagram

以下是我当前的查询:

@Query("WITH entries AS ( SELECT COUNT(log_id) AS log_entry_count FROM log_entries_table AS l 
LEFT JOIN exercise_workout_junction_table AS e ON e.exercise_workout_id = l.junction_id 
WHERE l.date IN (:dates) AND e.workout_id = :workoutID), 
sets AS ( SELECT sum(set_number) AS set_sum FROM exercise_workout_goals_table AS eg 
LEFT JOIN exercise_workout_junction_table ej ON ej.exercise_workout_id = eg.junction_id 
WHERE ej.workout_id = :workoutID) SELECT ((SELECT log_entry_count FROM entries) *100/ 
(SELECT set_sum FROM sets))  AS workout_completion_pct" )

LiveData<String> getWorkoutCompletionPercentage(int workoutID, List<String> dates);

【问题讨论】:

    标签: android sql sqlite android-room


    【解决方案1】:

    我不确定我是否正确理解了您想要的内容,但是您可以尝试这样的查询(也许您会了解主要思想并将其修复到您的用例中):

    // FIRST PART - MOST CHANGES HERE
    // AS a result you should get form there all exercises ID and logs (up to 3)
    WITH 
    entries AS 
    (SELECT l.junction_id, 
        CASE  
         WHEN count(log_id) > 3 THEN 3
         ELSE count(log_id)
        END log_entry_count FROM log_entries_table AS l 
    INNER JOIN exercise_workout_junction_table AS e ON e.exercise_workout_id = l.junction_id 
    WHERE l.date IN (:dates) AND e.workout_id = :workoutID
    GROUP BY junction_id)
    
    
    // SECOND PART - IS THE SAME
    sets AS ( SELECT sum(set_number) AS set_sum FROM exercise_workout_goals_table AS eg 
    LEFT JOIN exercise_workout_junction_table ej ON ej.exercise_workout_id = eg.junction_id WHERE ej.workout_id = :workoutID)
    
    
    // THIRD PART - LITTLE CHANGES
    // Change here - sum up all the counts of entries (they already cut to 3 maximal)
    SELECT ((SELECT SUM(log_entry_count) FROM entries) * 100/ 
    (SELECT set_sum FROM sets)) AS workout_completion_pct
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多