Changes between Version 6 and Version 7 of AdvancedReports


Ignore:
Timestamp:
09/24/26 12:49:29 (5 days ago)
Author:
201165
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v6 v7  
    103103)
    104104}}}
    105 == Извештај 3: Ден со најголем внес по корисник
     105== Извештај 3: Ден со најголем внес по корисник (АЖУРИРАНО)
    106106// Callorie-maxing view //
    107107=== Опис на барањата за податоци
    108108Фокус на денот со најмногу калории на секој корисник наспроти неговиот сопствен просек. секој корисник што води дневник на исхрана, извештајот го наоѓа денот во кој внел најмногу енергија. Тој ден го споредува со просечниот дневен внес на истиот корисник.
    109 * RANK() ги дели деновите по корисник и ги подредува по енергија
    110 * AVG() врз истата партиција го дава просекот.
    111 //ROW_NUMBER() прикажуваше само една инстанца ако имаше дупликати/денови со ист број калории//
     109* RANK() го избира најтешкиот ден
     110* AVG() врз партицијата личниот просек
     111* LAG() претходниот ден
     112* втор AVG() со ROWS BETWEEN 2 PRECEDING AND CURRENT ROW тридневен подвижен просек.
     113
     1141. weight_near_peak: тежината чиј датум е еднаков на датумот избран од внатрешен потпрашалник што ги подредува мерењата по временска оддалеченост од врвниот ден.
     1152. avg_peak_all_users и users_with_higher_peak: агрегат врз изведена табела од максимуми по корисник, која самата е агрегат врз изведена табела од дневни збирови.
    112116=== SQL - приказ
    113117{{{
    114 WITH daily_intake AS (
    115     SELECT u.username,
     118WITH daily AS (
     119    SELECT ip.user_id,
    116120           ip.date_time::date AS intake_day,
    117121           SUM(ip.kcal)       AS kcal_consumed,
    118            COUNT(*)           AS meals_logged,
    119            ROUND(AVG(SUM(ip.kcal)) OVER (PARTITION BY u.id)) AS avg_daily_kcal,
    120            RANK() OVER (PARTITION BY u.id ORDER BY SUM(ip.kcal) DESC) AS day_rank
    121     FROM "user" u
    122     JOIN intake_planner ip ON ip.user_id = u.id
     122           COUNT(*)           AS meals_logged
     123    FROM intake_planner ip
    123124    WHERE ip.is_consumed = TRUE
    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),
     127ranked 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)
     141SELECT (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
     181FROM ranked r
     182WHERE r.day_rank = 1
     183ORDER BY r.kcal_consumed DESC;
     184
     185}}}
     186=== Релациона алгебра - приказ (АЖУРИРАНО)
     187{{{
     188Daily    ← γ_{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 
     192Ranked   ← ω_{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 
     199Peaks    ← γ_{user_id; MAX(kcal_consumed) → peak} (Daily)
     200AvgPeak  ← γ_{; AVG(peak) → avg_peak_all_users} (Peaks)
     201Higher(x) ← γ_{; COUNT(*) → users_with_higher_peak} (σ_{peak > x} (Peaks))
     202 
     203Nearest(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 
    138209τ_{kcal_consumed DESC} (
    139   π_{username, intake_day, kcal_consumed, meals_logged, avg_daily_kcal} (
    140     σ_{day_rank = 1} (
    141       ω_{PARTITION BY u.id;
    142          RANK() ORDER BY kcal_consumed DESC → day_rank,
    143          AVG(kcal_consumed)                 → avg_daily_kcal} (Daily)
    144     )
     210  π_{username, intake_day, kcal_consumed, meals_logged, avg_daily_kcal,
     211     kcal_consumed − prev_day_kcal → change_vs_prev_day, moving_avg_3d,
     212     weight_near_peak, avg_peak_all_users, users_with_higher_peak, day_profile} (
     213    σ_{day_rank = 1} (Ranked) ⋈_{user_id = u.id} User
     214      ⟕ Nearest × AvgPeak × Higher(kcal_consumed)
    145215  )
    146216)
     217
    147218}}}
    148219== Извештај 4: Целосно растителни рецепти