| 124 | | GROUP BY u.id, u.username, ip.date_time::date |
| 125 | | ) |
| 126 | | SELECT username, intake_day, kcal_consumed, meals_logged, avg_daily_kcal |
| 127 | | FROM daily_intake |
| 128 | | WHERE day_rank = 1 |
| 129 | | ORDER BY kcal_consumed DESC; |
| 130 | | }}} |
| 131 | | === Релациона алгебра - приказ |
| 132 | | {{{ |
| 133 | | Daily ← γ_{u.id, u.username, date(ip.date_time) → intake_day; |
| 134 | | SUM(ip.kcal) → kcal_consumed, COUNT(*) → meals_logged} ( |
| 135 | | σ_{ip.is_consumed = TRUE} (User ⋈_{u.id = ip.user_id} Intake_Planner) |
| 136 | | ) |
| 137 | | |
| | 125 | GROUP BY ip.user_id, ip.date_time::date |
| | 126 | ), |
| | 127 | ranked AS ( |
| | 128 | SELECT d.*, |
| | 129 | RANK() OVER (PARTITION BY d.user_id |
| | 130 | ORDER BY d.kcal_consumed DESC) AS day_rank, |
| | 131 | ROUND(AVG(d.kcal_consumed) |
| | 132 | OVER (PARTITION BY d.user_id)) AS avg_daily_kcal, |
| | 133 | LAG(d.kcal_consumed) OVER (PARTITION BY d.user_id |
| | 134 | ORDER BY d.intake_day) AS prev_day_kcal, |
| | 135 | ROUND(AVG(d.kcal_consumed) OVER (PARTITION BY d.user_id |
| | 136 | ORDER BY d.intake_day |
| | 137 | ROWS BETWEEN 2 PRECEDING AND CURRENT ROW), 1) |
| | 138 | AS moving_avg_3d |
| | 139 | FROM daily d |
| | 140 | ) |
| | 141 | SELECT (SELECT u.username FROM "user" u WHERE u.id = r.user_id) AS username, |
| | 142 | r.intake_day, |
| | 143 | r.kcal_consumed, |
| | 144 | r.meals_logged, |
| | 145 | r.avg_daily_kcal, |
| | 146 | ROUND(r.kcal_consumed - r.prev_day_kcal, 2) AS change_vs_prev_day, |
| | 147 | r.moving_avg_3d, |
| | 148 | -- level 2: the weight measured closest in time to the peak day |
| | 149 | (SELECT bm.weight |
| | 150 | FROM biometrics bm |
| | 151 | WHERE bm.user_id = r.user_id |
| | 152 | AND bm.date = (SELECT bm2.date |
| | 153 | FROM biometrics bm2 |
| | 154 | WHERE bm2.user_id = r.user_id |
| | 155 | ORDER BY abs(bm2.date - r.intake_day) |
| | 156 | LIMIT 1)) AS weight_near_peak, |
| | 157 | -- level 3: the average peak day across all users, for context |
| | 158 | (SELECT ROUND(AVG(peaks.peak)) |
| | 159 | FROM (SELECT MAX(inner_daily.k) AS peak |
| | 160 | FROM (SELECT ip2.user_id AS uid, |
| | 161 | ip2.date_time::date AS d, |
| | 162 | SUM(ip2.kcal) AS k |
| | 163 | FROM intake_planner ip2 |
| | 164 | WHERE ip2.is_consumed = TRUE |
| | 165 | GROUP BY ip2.user_id, ip2.date_time::date) inner_daily |
| | 166 | GROUP BY inner_daily.uid) peaks) AS avg_peak_all_users, |
| | 167 | -- level 3: how many users had a higher peak than this one |
| | 168 | (SELECT COUNT(*) |
| | 169 | FROM (SELECT MAX(x.k) AS peak |
| | 170 | FROM (SELECT ip3.user_id AS uid, |
| | 171 | ip3.date_time::date AS d, |
| | 172 | SUM(ip3.kcal) AS k |
| | 173 | FROM intake_planner ip3 |
| | 174 | WHERE ip3.is_consumed = TRUE |
| | 175 | GROUP BY ip3.user_id, ip3.date_time::date) x |
| | 176 | GROUP BY x.uid) others |
| | 177 | WHERE others.peak > r.kcal_consumed) AS users_with_higher_peak, |
| | 178 | CASE WHEN r.kcal_consumed > 1.25 * r.avg_daily_kcal THEN 'spike day' |
| | 179 | WHEN r.kcal_consumed < 0.75 * r.avg_daily_kcal THEN 'light day' |
| | 180 | ELSE 'typical day' END AS day_profile |
| | 181 | FROM ranked r |
| | 182 | WHERE r.day_rank = 1 |
| | 183 | ORDER BY r.kcal_consumed DESC; |
| | 184 | |
| | 185 | }}} |
| | 186 | === Релациона алгебра - приказ (АЖУРИРАНО) |
| | 187 | {{{ |
| | 188 | Daily ← γ_{ip.user_id, date(ip.date_time) → intake_day; |
| | 189 | SUM(ip.kcal) → kcal_consumed, COUNT(*) → meals_logged} ( |
| | 190 | σ_{ip.is_consumed = TRUE} (Intake_Planner)) |
| | 191 | |
| | 192 | Ranked ← ω_{PARTITION BY user_id; |
| | 193 | RANK() ORDER BY kcal_consumed DESC → day_rank, |
| | 194 | AVG(kcal_consumed) → avg_daily_kcal, |
| | 195 | LAG(kcal_consumed) ORDER BY intake_day → prev_day_kcal, |
| | 196 | AVG(kcal_consumed) ORDER BY intake_day |
| | 197 | ROWS [-2, 0] → moving_avg_3d} (Daily) |
| | 198 | |
| | 199 | Peaks ← γ_{user_id; MAX(kcal_consumed) → peak} (Daily) |
| | 200 | AvgPeak ← γ_{; AVG(peak) → avg_peak_all_users} (Peaks) |
| | 201 | Higher(x) ← γ_{; COUNT(*) → users_with_higher_peak} (σ_{peak > x} (Peaks)) |
| | 202 | |
| | 203 | Nearest(row) ← π_{weight} ( |
| | 204 | σ_{bm.user_id = row.user_id ∧ |
| | 205 | bm.date ∈ π_{date}( τ_{|bm2.date − row.intake_day|} |
| | 206 | (σ_{bm2.user_id = row.user_id}(Biometrics)) [1] )} |
| | 207 | (Biometrics)) |
| | 208 | |