Oggi vediamo il seguente esercizio di LeetCode a tema SQL:
The confirmation rate of a user is the number of ‘confirmed’ messages divided by the total number of requested confirmation messages. The confirmation rate of a user that did not request any confirmation messages is 0. Round the confirmation rate to two decimal places.
Write a solution to find the confirmation rate of each user.
Return the result table in any order.
Guardando le tabelle fornite dall’esercizio si può notare che ci sono due tabelle: Signups (con user_id, time_id) e Confirmations (con user_id, action, time_id).
L’obiettivo è calcolare il tasso di conferma per ogni utente. Il tasso di conferma è il numero di conferme ‘confirmed’ diviso per il totale delle richieste di conferma. Se un utente non ha richiesto alcuna conferma, il tasso è 0.
Detto ciò, la soluzione che proponiamo noi è la seguente:
SELECT A.user_id, ROUND(IFNULL(AVG(action = 'confirmed'), 0), 2) AS confirmation_rate
FROM Signups A
LEFT JOIN Confirmations B ON A.user_id = B.user_id
GROUP BY A.user_idIn questa query:
- La
LEFT JOINtra Signups e Confirmations mantiene tutti gli utenti, anche quelli senza conferme AVG(action = 'confirmed')è un trick MySQL dove ‘confirmed’ viene trattato come 1 e altri valori come 0, calcolando così la media delle confermeIFNULL(..., 0)gestisce il caso di utenti senza conferme, restituendo 0 invece di NULLROUND(..., 2)arrotonda il risultato a 2 decimaliGROUP BY A.user_idraggruppa i risultati per utente
Questo esercizio sfrutta il fatto che in MySQL le espressioni booleane restituiscono 1 o 0 per calcolare la media.
Se hai dubbi in merito non esitare a contattarci sui nostri social, saremo più che felici di risponderti :)