Oggi vediamo il seguente esercizio di LeetCode a tema SQL:
Write a solution to report the daily active user count for a 30-day period ending on 2019-07-27 inclusively. A user became active on a given day if they made at least one activity on that day.
Return the result table in any order.
Guardando le tabelle fornite dall’esercizio si può notare che la tabella Activity contiene le informazioni sulle attività degli utenti: user_id, activity_date, activity_type, activity_id.
L’obiettivo è calcolare il numero di utenti attivi per ogni giorno in un periodo di 30 giorni che termina il 2019-07-27. Dobbiamo considerare solo gli utenti unici che hanno effettuato almeno un’attività in quel giorno.
Detto ciò, la soluzione che proponiamo noi è la seguente:
SELECT activity_date AS day, COUNT(DISTINCT user_id) AS active_users
FROM (
SELECT DISTINCT user_id, activity_date
FROM Activity
) AS aux
WHERE activity_date > '2019-06-27' AND activity_date <= '2019-07-27'
GROUP BY activity_dateIn questa query:
- La subquery interna
SELECT DISTINCT user_id, activity_daterimuove i duplicati per utente-giorno, perché un utente può fare più attività nello stesso giorno - La clausola
WHERE activity_date > '2019-06-27' AND activity_date <= '2019-07-27'filtra le date per il periodo di 30 giorni richiesto COUNT(DISTINCT user_id)conta gli utenti unici attivi per ogni giornoGROUP BY activity_dateraggruppa i risultati per giorno
Questo esercizio richiede l’uso di subquery per eliminare i duplicati prima del conteggio.
Se hai dubbi in merito non esitare a contattarci sui nostri social, saremo più che felici di risponderti :)