335 | | === Годишен извештај за нови корисници и резервации по месец |
336 | | Агрегира број на нови корисници и број на резервации месечно за целата година. Дава целосен увид во растот на платформата. |
337 | | {{{ |
338 | | CREATE OR REPLACE FUNCTION GetMonthlyUserReservationReport(year INT) |
339 | | RETURNS TABLE( |
340 | | Month INT, |
341 | | NewUsers bigint, |
342 | | TotalReservations bigint |
343 | | ) |
344 | | LANGUAGE plpgsql |
345 | | AS $$ |
346 | | BEGIN |
347 | | RETURN QUERY |
348 | | SELECT |
349 | | m.Month, |
350 | | COUNT(DISTINCT u.id_user) AS NewUsers, |
351 | | COALESCE(SUM(r.ReservationCount),0) AS TotalReservations |
352 | | FROM ( |
353 | | SELECT EXTRACT(MONTH FROM birth_date)::INT AS Month, id_user |
354 | | FROM travel_sage.users |
355 | | WHERE EXTRACT(YEAR FROM birth_date) = year |
356 | | ) u |
357 | | LEFT JOIN ( |
358 | | SELECT EXTRACT(MONTH FROM time_point)::INT AS Month, id_reservation, |
359 | | id_user, COUNT(*) AS ReservationCount |
360 | | FROM travel_sage.reservation |
361 | | WHERE EXTRACT(YEAR FROM time_point) = year |
362 | | GROUP BY Month, id_reservation, id_user |
363 | | ) r ON u.id_user = r.id_user AND u.Month = r.Month |
364 | | RIGHT JOIN (SELECT generate_series(1,12) AS Month) m ON m.Month = u.Month OR m.Month = r.Month |
365 | | GROUP BY m.Month |
366 | | ORDER BY m.Month; |
367 | | END; |
368 | | $$; |
369 | | }}} |