| 105 | | == Извештај 3: Целосно растителни рецепти |
| 106 | | |
| 107 | | === Опис на барањата за податоци |
| 108 | | === SQL - приказ |
| 109 | | === Релациона алгебра - приказ |
| 110 | | |
| 111 | | == Извештај 4: Ден со најголем внес по корисник |
| 112 | | |
| 113 | | === Опис на барањата за податоци |
| 114 | | === SQL - приказ |
| 115 | | === Релациона алгебра - приказ |
| 116 | | |
| | 105 | == Извештај 3: Ден со најголем внес по корисник |
| | 106 | // Callorie-maxing view // |
| | 107 | === Опис на барањата за податоци |
| | 108 | Фокус на денот со најмногу калории на секој корисник наспроти неговиот сопствен просек. секој корисник што води дневник на исхрана, извештајот го наоѓа денот во кој внел најмногу енергија. Тој ден го споредува со просечниот дневен внес на истиот корисник. |
| | 109 | * RANK() ги дели деновите по корисник и ги подредува по енергија |
| | 110 | * AVG() врз истата партиција го дава просекот. |
| | 111 | //ROW_NUMBER() прикажуваше само една инстанца ако имаше дупликати/денови со ист број калории// |
| | 112 | === SQL - приказ |
| | 113 | {{{ |
| | 114 | WITH daily_intake AS ( |
| | 115 | SELECT u.username, |
| | 116 | ip.date_time::date AS intake_day, |
| | 117 | 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 |
| | 123 | 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 | |
| | 138 | τ_{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 | ) |
| | 145 | ) |
| | 146 | ) |
| | 147 | }}} |
| | 148 | == Извештај 4: Целосно растителни рецепти |
| | 149 | //Go Green Filter// |
| | 150 | === Опис на барањата за податоци |
| | 151 | Рецепти чија секоја состојка е од растителна категорија, проверени наспроти веганската ознака. пронаоѓа рецептите во кои секоја состојка е од растително потекло. Тоа е релациско делење: рецептот се квалификува само ако бројот на неговите растителни состојки е еднаков на бројот на сите негови состојки. Една состојка од животинско потекло го дисквалификува целиот рецепт. Растителни се типовите: |
| | 152 | * vegetable |
| | 153 | * fruit |
| | 154 | * legume |
| | 155 | * nut |
| | 156 | * seed |
| | 157 | * oil |
| | 158 | * herb |
| | 159 | * spice |
| | 160 | * carb |
| | 161 | * beverage |
| | 162 | * //Медот и јајцето// се од типот **other** -> дисквалификуваат |
| | 163 | === SQL - приказ |
| | 164 | {{{ |
| | 165 | SELECT r.name AS recipe, |
| | 166 | u.username AS author, |
| | 167 | COUNT(*) AS ingredient_count, |
| | 168 | ROUND(r.kcal_sum / r.servings) AS kcal_per_portion, |
| | 169 | EXISTS (SELECT 1 |
| | 170 | FROM recipe_contains_restriction rcr |
| | 171 | JOIN restriction res ON res.id = rcr.restriction_id |
| | 172 | WHERE rcr.recipe_id = r.id |
| | 173 | AND res.type = 'vegan') AS tagged_vegan |
| | 174 | FROM recipe r |
| | 175 | JOIN "user" u ON u.id = r.user_id |
| | 176 | JOIN recipe_contains_ingredient rci ON rci.recipe_id = r.id |
| | 177 | JOIN ingredient i ON i.id = rci.ingredient_id |
| | 178 | WHERE i.type IN ('vegetable', 'fruit', 'legume', 'nut', 'seed', |
| | 179 | 'oil', 'herb', 'spice', 'carb', 'beverage') |
| | 180 | GROUP BY r.id, r.name, u.username, r.kcal_sum, r.servings |
| | 181 | HAVING COUNT(*) = (SELECT COUNT(*) |
| | 182 | FROM recipe_contains_ingredient rci2 |
| | 183 | WHERE rci2.recipe_id = r.id) |
| | 184 | ORDER BY kcal_per_portion; |
| | 185 | }}} |
| | 186 | === Релациона алгебра - приказ |
| | 187 | {{{ |
| | 188 | Plant ← {'vegetable', 'fruit', 'legume', 'nut', 'seed', |
| | 189 | 'oil', 'herb', 'spice', 'carb', 'beverage'} |
| | 190 | |
| | 191 | AnimalUse ← π_{rci.recipe_id} ( |
| | 192 | σ_{i.type ∉ Plant} ( |
| | 193 | Recipe_Contains_Ingredient ⋈_{rci.ingredient_id = i.id} Ingredient |
| | 194 | ) |
| | 195 | ) |
| | 196 | |
| | 197 | PlantOnly ← π_{rci.recipe_id} (Recipe_Contains_Ingredient) − AnimalUse |
| | 198 | |
| | 199 | τ_{kcal_per_portion} ( |
| | 200 | γ_{r.id, r.name, u.username; COUNT(*) → ingredient_count} ( |
| | 201 | (PlantOnly ⋈_{recipe_id = r.id} Recipe) |
| | 202 | ⋈_{r.user_id = u.id} User |
| | 203 | ⋈_{r.id = rci.recipe_id} Recipe_Contains_Ingredient |
| | 204 | ) |
| | 205 | ) |
| | 206 | }}} |