Complex DB Reports (SQL, Stored Procedures, Relational Algebra)
Sitter Performance
This 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. This SQL query:
- Analyzes the bookings by counting total, completed and missed bookings
- Calculates total money generated from completed bookings only
- Evaluates quality by finding average customer ratings from reviews table
- Ranks the sitters using a custom weighted performance score - valuing money, completed bookings and high ratings.
SQL
WITH params AS (
SELECT
CAST(:start_date AS DATE) AS start_date,
CAST(:end_date AS DATE) AS end_date
),
sitter_stats AS (
SELECT
b.sitter_id,
COUNT(b.booking_id) AS total_bookings,
COUNT(b.booking_id) FILTER (WHERE b.status = 'Completed') AS completed_bookings,
COUNT(b.booking_id) FILTER (WHERE b.status IN ('Canceled', 'Rejected')) AS missed_bookings
FROM bookings b
JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
GROUP BY b.sitter_id
),
sitter_reports AS (
SELECT
b.sitter_id,
SUM(pay.amount) AS total_revenue
FROM bookings b
JOIN payments pay ON b.booking_id = pay.booking_id
JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
WHERE b.status = 'Completed'
GROUP BY b.sitter_id
),
sitter_ratings AS (
SELECT
b.sitter_id,
AVG(r.rating)::numeric(10,2) AS avg_rating,
COUNT(r.review_id) AS total_reviews
FROM bookings b
JOIN reviews r ON b.booking_id = r.booking_id
JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
GROUP BY b.sitter_id
)
SELECT
u.user_id,
u.username,
u.first_name,
u.last_name,
COALESCE(ss.total_bookings, 0) AS total_bookings,
COALESCE(ss.completed_bookings, 0) AS completed_bookings,
COALESCE(ss.missed_bookings, 0) AS missed_bookings,
COALESCE(sr.avg_rating, 0) AS avg_rating,
COALESCE(sr.total_reviews, 0) AS total_reviews,
COALESCE(sf.total_revenue, 0) AS total_revenue,
(
COALESCE(sf.total_revenue, 0) * 0.5
+ COALESCE(ss.completed_bookings, 0) * 10
+ COALESCE(sr.avg_rating, 0) * 15
- COALESCE(ss.missed_bookings, 0) * 5
) AS sitter_score,
DENSE_RANK() OVER (
ORDER BY (
COALESCE(sf.total_revenue, 0) * 0.5
+ COALESCE(ss.completed_bookings, 0) * 10
+ COALESCE(sr.avg_rating, 0) * 15
- COALESCE(ss.missed_bookings, 0) * 5
) DESC,
COALESCE(sr.avg_rating, 0) DESC
) AS sitter_rank
FROM users u
JOIN pet_sitters ps ON u.user_id = ps.user_id
LEFT JOIN sitter_stats ss ON ss.sitter_id = ps.user_id
LEFT JOIN sitter_reports sf ON sf.sitter_id = ps.user_id
LEFT JOIN sitter_ratings sr ON sr.sitter_id = ps.user_id
WHERE COALESCE(ss.total_bookings, 0) > 0
ORDER BY sitter_rank
LIMIT 10;
Relational algebra
Params <- {(start_date, end_date)}
SitterStats <-
γ
sitter_id := b.sitter_id;
total_bookings := COUNT(b.booking_id);
completed_bookings := COUNT(b.status = 'Completed');
missed_bookings := COUNT(b.status = 'Canceled' ∨ b.status = 'Rejected')
(
bookings b ⨝
(b.date_from ≥ p.start_date ∧ b.date_from < p.end_date)
Params p
)
SitterReports <-
γ
sitter_id := b.sitter_id;
total_revenue := SUM(pay.amount)
(
σ b.status = 'Completed'
(
(bookings b ⨝ (b.booking_id = pay.booking_id) payments pay)
⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
)
)
SitterRatings <-
γ
sitter_id := b.sitter_id;
avg_rating := AVG(r.rating);
total_reviews := COUNT(r.review_id)
(
(bookings b ⨝ (b.booking_id = r.booking_id) reviews r)
⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
)
SitterBase <-
(users u ⨝ (u.user_id = ps.user_id) pet_sitters ps)
MergedData <-
(
(
(SitterBase ⟕ (u.user_id = ss.sitter_id) SitterStats ss)
⟕ (u.user_id = sf.sitter_id) SitterReports sf
)
⟕ (u.user_id = sr.sitter_id) SitterRatings sr
)
ActiveSitters <-
σ COALESCE(ss.total_bookings, 0) > 0
(MergedData)
ScoredSitters <-
π
user_id, username, first_name, last_name,
total_bookings := COALESCE(ss.total_bookings, 0),
completed_bookings := COALESCE(ss.completed_bookings, 0),
missed_bookings := COALESCE(ss.missed_bookings, 0),
avg_rating := COALESCE(sr.avg_rating, 0),
total_reviews := COALESCE(sr.total_reviews, 0),
total_revenue := COALESCE(sf.total_revenue, 0),
sitter_score := (
COALESCE(sf.total_revenue, 0) * 0.5 +
COALESCE(ss.completed_bookings, 0) * 10 +
COALESCE(sr.avg_rating, 0) * 15 -
COALESCE(ss.missed_bookings, 0) * 5
)
(ActiveSitters)
RankedSitters <-
rank_dense
sitter_rank :=
ORDER BY
sitter_score DESC,
avg_rating DESC
(ScoredSitters)
Result <-
topK_{K := 10}
(
τ sitter_rank ASC
(RankedSitters)
)
Highest paying customers
This SQL query wants to find the platform's most profitable pet owners and discover their primary service interests. This query:
- Sums total profit generated from successful bookings
- Counts canceled bookings to determine customer reliability
- Discovers the user's top interest by ranking their most frequently booked service types
- Counts the total number of registered pets per owner
- Combines everything and ranks customers based on total profit and successful booking volume
SQL
WITH params AS (
SELECT
CAST(:start_date AS DATE) AS start_date,
CAST(:end_date AS DATE) AS end_date
),
owner_reports AS (
SELECT
b.owner_id,
SUM(pay.amount) AS total_profit_generated,
COUNT(DISTINCT b.booking_id) AS successful_bookings
FROM bookings b
JOIN payments pay ON b.booking_id = pay.booking_id
JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
WHERE b.status = 'Completed'
GROUP BY b.owner_id
),
owner_activity AS (
SELECT
b.owner_id,
COUNT(b.booking_id) FILTER (WHERE b.status IN ('Canceled', 'Rejected')) AS canceled_bookings
FROM bookings b
JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
GROUP BY b.owner_id
),
service_counts AS (
SELECT
b.owner_id,
s.type AS service_type,
COUNT(bs.service_id) AS times_booked,
ROW_NUMBER() OVER(PARTITION BY b.owner_id ORDER BY COUNT(bs.service_id) DESC) as rank_num
FROM bookings b
JOIN booking_services bs ON b.booking_id = bs.booking_id
JOIN services s ON bs.service_id = s.service_id
JOIN params p ON b.date_from >= p.start_date AND b.date_from < p.end_date
GROUP BY b.owner_id, s.type
),
favorite_service AS (
SELECT
owner_id,
service_type AS top_interest
FROM service_counts
WHERE rank_num = 1
),
pet_portfolio AS (
SELECT
owner_id,
COUNT(pet_id) AS registered_pets
FROM pets
GROUP BY owner_id
)
SELECT
u.user_id,
u.first_name,
u.last_name,
COALESCE(ofin.successful_bookings, 0) AS successful_bookings,
COALESCE(oa.canceled_bookings, 0) AS canceled_bookings,
COALESCE(pp.registered_pets, 0) AS total_pets,
COALESCE(fs.top_interest, 'Unknown') AS top_interest,
COALESCE(ofin.total_profit_generated, 0) AS total_profit_generated,
DENSE_RANK() OVER (
ORDER BY
COALESCE(ofin.total_profit_generated, 0) DESC,
COALESCE(ofin.successful_bookings, 0) DESC
) AS customer_rank
FROM users u
JOIN pet_owners po ON u.user_id = po.user_id
LEFT JOIN owner_reports ofin ON po.user_id = ofin.owner_id
LEFT JOIN owner_activity oa ON po.user_id = oa.owner_id
LEFT JOIN favorite_service fs ON po.user_id = fs.owner_id
LEFT JOIN pet_portfolio pp ON po.user_id = pp.owner_id
WHERE COALESCE(ofin.successful_bookings, 0) > 0
ORDER BY customer_rank
LIMIT 10;
Relational algebra
Params <- {(start_date, end_date)}
OwnerReports <-
γ
owner_id := b.owner_id;
total_profit := SUM(pay.amount);
successful := COUNT_DISTINCT(b.booking_id)
(
σ b.status = 'Completed'
(
(bookings b ⨝ (b.booking_id = pay.booking_id) payments pay)
⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
)
)
OwnerActivity <-
γ
owner_id := b.owner_id;
canceled := COUNT(b.status = 'Canceled' ∨ b.status = 'Rejected')
(
bookings b ⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
)
ServiceCounts <-
γ
owner_id := b.owner_id;
service_type := s.type;
times_booked := COUNT(bs.service_id)
(
(
(bookings b ⨝ (b.booking_id = bs.booking_id) booking_services bs)
⨝ (bs.service_id = s.service_id) services s
)
⨝ (b.date_from ≥ p.start_date ∧ b.date_from < p.end_date) Params p
)
RankedServices <-
rank_row_number
rank_num :=
ORDER BY times_booked DESC
PARTITION BY owner_id
(ServiceCounts)
FavoriteService <-
π
owner_id,
top_interest := service_type
(
σ rank_num = 1 (RankedServices)
)
PetPortfolio <-
γ
owner_id := owner_id;
registered_pets := COUNT(pet_id)
(pets)
OwnerBase <-
(users u ⨝ (u.user_id = po.user_id) pet_owners po)
MergedData <-
(
(
(
(OwnerBase ⟕ (u.user_id = ofin.owner_id) OwnerReports ofin)
⟕ (u.user_id = oa.owner_id) OwnerActivity oa
)
⟕ (u.user_id = fs.owner_id) FavoriteService fs
)
⟕ (u.user_id = pp.owner_id) PetPortfolio pp
)
ActiveOwners <-
σ COALESCE(ofin.successful, 0) > 0
(MergedData)
ScoredOwners <-
π
user_id, first_name, last_name,
successful_bookings := COALESCE(ofin.successful, 0),
canceled_bookings := COALESCE(oa.canceled, 0),
total_pets := COALESCE(pp.registered_pets, 0),
top_interest := COALESCE(fs.top_interest, 'Unknown'),
total_profit_generated := COALESCE(ofin.total_profit, 0)
(ActiveOwners)
RankedOwners <-
rank_dense
customer_rank :=
ORDER BY total_profit_generated DESC, successful_bookings DESC
(ScoredOwners)
Result <-
topK_{K := 10}
(
τ customer_rank ASC
(RankedOwners)
)
Last modified
8 hours ago
Last modified on 05/25/26 15:34:19
Note:
See TracWiki
for help on using the wiki.
