Changes between Initial Version and Version 1 of AdvancedReports


Ignore:
Timestamp:
05/22/26 01:18:14 (4 days ago)
Author:
181201
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v1 v1  
     1= Complex DB Reports (SQL, Stored Procedures, Relational Algebra)
     2
     3== Sitter Performance
     4This SQL query wants to evaluate and rank pet sitters to find the top performers. A top performer is a sitter who completes bookings in a reliable way, has high ratings and generates high revenue.
     5This SQL query:
     6
     7* Analyzes the bookings by counting total, completed and missed bookings
     8* Calculates total money generated from completed bookings only
     9* Evaluates quality by finding average customer ratings from reviews table
     10* Ranks the sitters using a custom weighted performance score - valuing money, completed bookings and high ratings.
     11
     12=== SQL
     13{{{#!sql
     14WITH params AS (
     15    SELECT
     16        CAST(:start_date AS DATE) AS start_date,
     17        CAST(:end_date AS DATE)   AS end_date
     18),
     19
     20sitter_stats AS (
     21    SELECT
     22        b.sitter_id,
     23        COUNT(b.booking_id) AS total_bookings,
     24        COUNT(b.booking_id) FILTER (WHERE b.status = 'Completed') AS completed_bookings,
     25        COUNT(b.booking_id) FILTER (WHERE b.status IN ('Canceled', 'Rejected')) AS missed_bookings
     26    FROM bookings b
     27    JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
     28    GROUP BY b.sitter_id
     29),
     30
     31sitter_financials AS (
     32    SELECT
     33        b.sitter_id,
     34        SUM(pay.amount) AS total_revenue
     35    FROM bookings b
     36    JOIN payments pay ON b.booking_id = pay.booking_id
     37    JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
     38    WHERE b.status = 'Completed'
     39    GROUP BY b.sitter_id
     40),
     41
     42sitter_ratings AS (
     43    SELECT
     44        b.sitter_id,
     45        AVG(r.rating)::numeric(10,2) AS avg_rating,
     46        COUNT(r.review_id) AS total_reviews
     47    FROM bookings b
     48    JOIN reviews r ON b.booking_id = r.booking_id
     49    JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
     50    GROUP BY b.sitter_id
     51)
     52
     53SELECT
     54    u.user_id,
     55    u.username,
     56    u.first_name,
     57    u.last_name,
     58    COALESCE(ss.total_bookings, 0) AS total_bookings,
     59    COALESCE(ss.completed_bookings, 0) AS completed_bookings,
     60    COALESCE(ss.missed_bookings, 0) AS missed_bookings,
     61    COALESCE(sr.avg_rating, 0) AS avg_rating,
     62    COALESCE(sr.total_reviews, 0) AS total_reviews,
     63    COALESCE(sf.total_revenue, 0) AS total_revenue,
     64   
     65    (
     66        COALESCE(sf.total_revenue, 0) * 0.5
     67        + COALESCE(ss.completed_bookings, 0) * 10
     68        + COALESCE(sr.avg_rating, 0) * 15
     69        - COALESCE(ss.missed_bookings, 0) * 5
     70    ) AS sitter_score,
     71   
     72    DENSE_RANK() OVER (
     73        ORDER BY (
     74            COALESCE(sf.total_revenue, 0) * 0.5
     75            + COALESCE(ss.completed_bookings, 0) * 10
     76            + COALESCE(sr.avg_rating, 0) * 15
     77            - COALESCE(ss.missed_bookings, 0) * 5
     78        ) DESC,
     79        COALESCE(sr.avg_rating, 0) DESC
     80    ) AS sitter_rank
     81
     82FROM users u
     83JOIN pet_sitters ps ON u.user_id = ps.user_id
     84LEFT JOIN sitter_stats ss ON ss.sitter_id = ps.user_id
     85LEFT JOIN sitter_financials sf ON sf.sitter_id = ps.user_id
     86LEFT JOIN sitter_ratings sr ON sr.sitter_id = ps.user_id
     87WHERE COALESCE(ss.total_bookings, 0) > 0
     88ORDER BY sitter_rank
     89LIMIT 10;
     90}}}
     91
     92=== Relational algebra
     93{{{
     94Params <- {(start_date, end_date)}
     95
     96SitterStats <-
     97γ
     98  sitter_id := b.sitter_id;
     99  total_bookings := COUNT(b.booking_id);
     100  completed_bookings := COUNT(b.status = 'Completed');
     101  missed_bookings := COUNT(b.status = 'Canceled' ∨ b.status = 'Rejected')
     102(
     103  bookings b ⨝
     104  (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date)
     105  Params p
     106)
     107
     108SitterFinancials <-
     109γ
     110  sitter_id := b.sitter_id;
     111  total_revenue := SUM(pay.amount)
     112(
     113  σ b.status = 'Completed'
     114  (
     115    (bookings b ⨝ (b.booking_id = pay.booking_id) payments pay)
     116    ⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
     117  )
     118)
     119
     120SitterRatings <-
     121γ
     122  sitter_id := b.sitter_id;
     123  avg_rating := AVG(r.rating);
     124  total_reviews := COUNT(r.review_id)
     125(
     126  (bookings b ⨝ (b.booking_id = r.booking_id) reviews r)
     127  ⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
     128)
     129
     130SitterBase <-
     131(users u ⨝ (u.user_id = ps.user_id) pet_sitters ps)
     132
     133MergedData <-
     134(
     135  (
     136    (SitterBase ⟕ (u.user_id = ss.sitter_id) SitterStats ss)
     137    ⟕ (u.user_id = sf.sitter_id) SitterFinancials sf
     138  )
     139  ⟕ (u.user_id = sr.sitter_id) SitterRatings sr
     140)
     141
     142ActiveSitters <-
     143σ COALESCE(ss.total_bookings, 0) > 0
     144(MergedData)
     145
     146ScoredSitters <-
     147π
     148  user_id, username, first_name, last_name,
     149  total_bookings := COALESCE(ss.total_bookings, 0),
     150  completed_bookings := COALESCE(ss.completed_bookings, 0),
     151  missed_bookings := COALESCE(ss.missed_bookings, 0),
     152  avg_rating := COALESCE(sr.avg_rating, 0),
     153  total_reviews := COALESCE(sr.total_reviews, 0),
     154  total_revenue := COALESCE(sf.total_revenue, 0),
     155  sitter_score := (
     156    COALESCE(sf.total_revenue, 0) * 0.5 +
     157    COALESCE(ss.completed_bookings, 0) * 10 +
     158    COALESCE(sr.avg_rating, 0) * 15 -
     159    COALESCE(ss.missed_bookings, 0) * 5
     160  )
     161(ActiveSitters)
     162
     163RankedSitters <-
     164rank_dense
     165  sitter_rank :=
     166    ORDER BY
     167      sitter_score DESC,
     168      avg_rating DESC
     169(ScoredSitters)
     170
     171Result <-
     172topK_{K := 10}
     173(
     174  τ sitter_rank ASC
     175  (RankedSitters)
     176)
     177}}}
     178
     179== Highest paying customers
     180This SQL query wants to find the platform's most profitable pet owners and discover their primary service interests.
     181This query:
     182
     183* Sums total profit generated from successful bookings
     184* Counts canceled bookings to determine customer reliability
     185* Discovers the user's top interest by ranking their most frequently booked service types
     186* Counts the total number of registered pets per owner
     187* Combines everything and ranks customers based on total profit and successful booking volume
     188
     189=== SQL
     190{{{#!sql
     191WITH params AS (
     192    SELECT
     193        CAST('2020-01-01' AS DATE) AS start_date,
     194        CAST('2030-01-01' AS DATE) AS end_date
     195),
     196
     197owner_financials AS (
     198    SELECT
     199        b.owner_id,
     200        SUM(pay.amount) AS total_profit_generated,
     201        COUNT(DISTINCT b.booking_id) AS successful_bookings
     202    FROM bookings b
     203    JOIN payments pay ON b.booking_id = pay.booking_id
     204    JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
     205    WHERE b.status = 'Completed'
     206    GROUP BY b.owner_id
     207),
     208
     209owner_activity AS (
     210    SELECT
     211        b.owner_id,
     212        COUNT(b.booking_id) FILTER (WHERE b.status IN ('Canceled', 'Rejected')) AS canceled_bookings
     213    FROM bookings b
     214    JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
     215    GROUP BY b.owner_id
     216),
     217
     218service_counts AS (
     219    SELECT
     220        b.owner_id,
     221        s.type AS service_type,
     222        COUNT(bs.service_id) AS times_booked,
     223        ROW_NUMBER() OVER(PARTITION BY b.owner_id ORDER BY COUNT(bs.service_id) DESC) as rank_num
     224    FROM bookings b
     225    JOIN booking_services bs ON b.booking_id = bs.booking_id
     226    JOIN services s ON bs.service_id = s.service_id
     227    JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
     228    GROUP BY b.owner_id, s.type
     229),
     230
     231favorite_service AS (
     232    SELECT
     233        owner_id,
     234        service_type AS top_interest
     235    FROM service_counts
     236    WHERE rank_num = 1
     237),
     238
     239pet_portfolio AS (
     240    SELECT
     241        owner_id,
     242        COUNT(pet_id) AS registered_pets
     243    FROM pets
     244    GROUP BY owner_id
     245)
     246
     247SELECT
     248    u.user_id,
     249    u.first_name,
     250    u.last_name,
     251    COALESCE(ofin.successful_bookings, 0) AS successful_bookings,
     252    COALESCE(oa.canceled_bookings, 0) AS canceled_bookings,
     253    COALESCE(pp.registered_pets, 0) AS total_pets,
     254    COALESCE(fs.top_interest, 'Unknown') AS top_interest,
     255    COALESCE(ofin.total_profit_generated, 0) AS total_profit_generated,
     256   
     257    DENSE_RANK() OVER (
     258        ORDER BY
     259            COALESCE(ofin.total_profit_generated, 0) DESC,
     260            COALESCE(ofin.successful_bookings, 0) DESC
     261    ) AS customer_rank
     262
     263FROM users u
     264JOIN pet_owners po ON u.user_id = po.user_id
     265LEFT JOIN owner_financials ofin ON po.user_id = ofin.owner_id
     266LEFT JOIN owner_activity oa ON po.user_id = oa.owner_id
     267LEFT JOIN favorite_service fs ON po.user_id = fs.owner_id
     268LEFT JOIN pet_portfolio pp ON po.user_id = pp.owner_id
     269WHERE COALESCE(ofin.successful_bookings, 0) > 0
     270ORDER BY customer_rank
     271LIMIT 10;
     272}}}
     273
     274=== Relational algebra
     275{{{
     276Params <- {(start_date, end_date)}
     277
     278OwnerFinancials <-
     279γ
     280  owner_id := b.owner_id;
     281  total_profit := SUM(pay.amount);
     282  successful := COUNT_DISTINCT(b.booking_id)
     283(
     284  σ b.status = 'Completed'
     285  (
     286    (bookings b ⨝ (b.booking_id = pay.booking_id) payments pay)
     287    ⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
     288  )
     289)
     290
     291OwnerActivity <-
     292γ
     293  owner_id := b.owner_id;
     294  canceled := COUNT(b.status = 'Canceled' ∨ b.status = 'Rejected')
     295(
     296  bookings b ⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
     297)
     298
     299ServiceCounts <-
     300γ
     301  owner_id := b.owner_id;
     302  service_type := s.type;
     303  times_booked := COUNT(bs.service_id)
     304(
     305  (
     306    (bookings b ⨝ (b.booking_id = bs.booking_id) booking_services bs)
     307    ⨝ (bs.service_id = s.service_id) services s
     308  )
     309  ⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
     310)
     311
     312RankedServices <-
     313rank_row_number
     314  rank_num :=
     315    ORDER BY times_booked DESC
     316    PARTITION BY owner_id
     317(ServiceCounts)
     318
     319FavoriteService <-
     320π
     321  owner_id,
     322  top_interest := service_type
     323(
     324  σ rank_num = 1 (RankedServices)
     325)
     326
     327PetPortfolio <-
     328γ
     329  owner_id := owner_id;
     330  registered_pets := COUNT(pet_id)
     331(pets)
     332
     333OwnerBase <-
     334(users u ⨝ (u.user_id = po.user_id) pet_owners po)
     335
     336MergedData <-
     337(
     338  (
     339    (
     340      (OwnerBase ⟕ (u.user_id = ofin.owner_id) OwnerFinancials ofin)
     341      ⟕ (u.user_id = oa.owner_id) OwnerActivity oa
     342    )
     343    ⟕ (u.user_id = fs.owner_id) FavoriteService fs
     344  )
     345  ⟕ (u.user_id = pp.owner_id) PetPortfolio pp
     346)
     347
     348ActiveOwners <-
     349σ COALESCE(ofin.successful, 0) > 0
     350(MergedData)
     351
     352ScoredOwners <-
     353π
     354  user_id, first_name, last_name,
     355  successful_bookings := COALESCE(ofin.successful, 0),
     356  canceled_bookings := COALESCE(oa.canceled, 0),
     357  total_pets := COALESCE(pp.registered_pets, 0),
     358  top_interest := COALESCE(fs.top_interest, 'Unknown'),
     359  total_profit_generated := COALESCE(ofin.total_profit, 0)
     360(ActiveOwners)
     361
     362RankedOwners <-
     363rank_dense
     364  customer_rank :=
     365    ORDER BY total_profit_generated DESC, successful_bookings DESC
     366(ScoredOwners)
     367
     368Result <-
     369topK_{K := 10}
     370(
     371  τ customer_rank ASC
     372  (RankedOwners)
     373)
     374}}}