Files
Temp_MSSPLASHPage/SQL/analysis_recovered_users.sql
2025-10-22 08:05:42 -06:00

240 lines
8.8 KiB
Transact-SQL

-- ============================================================================
-- ANÁLISIS DE USUARIOS RECUPERADOS - Comparación de 3 conceptos diferentes
-- ============================================================================
-- Este SQL ayuda a entender las diferencias entre los 3 widgets:
-- 1. Usuarios Recuperados (LoyaltyType = 'Recurrent')
-- 2. Top 5 Usuarios Recuperados (IsRecoveredUser = true)
-- 3. Tasa de Recuperación (usuarios inactivos que regresaron)
-- ============================================================================
-- Parámetros de fechas (ajustar según necesidad)
-- DECLARE @StartDate DATE = '2025-01-01';
-- DECLARE @EndDate DATE = '2025-01-22';
-- Para PostgreSQL usar:
DO $$
DECLARE
start_date DATE := '2025-01-01';
end_date DATE := CURRENT_DATE;
BEGIN
-- ============================================================================
-- CONCEPTO 1: LoyaltyType = 'Recurrent' (Widget: Usuarios Recuperados)
-- ============================================================================
RAISE NOTICE '=== CONCEPTO 1: LoyaltyType = Recurrent ===';
RAISE NOTICE 'Usuarios con loyalty_type = Recurrent en el período';
SELECT
'LoyaltyType Recurrent' as concepto,
COUNT(DISTINCT client_mac) as total_usuarios_unicos,
COUNT(*) as total_conexiones,
MIN(connection_date) as primera_fecha,
MAX(connection_date) as ultima_fecha
FROM splash_wifi_connection_report
WHERE loyalty_type = 'Recurrent'
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted;
-- Detalle de usuarios Recurrent
SELECT
client_mac,
user_name,
email,
loyalty_type,
COUNT(*) as total_conexiones,
MIN(connection_date) as primera_conexion,
MAX(connection_date) as ultima_conexion,
MAX(connection_date_time) as ultima_conexion_datetime
FROM splash_wifi_connection_report
WHERE loyalty_type = 'Recurrent'
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted
GROUP BY client_mac, user_name, email, loyalty_type
ORDER BY total_conexiones DESC
LIMIT 10;
-- ============================================================================
-- CONCEPTO 2: IsRecoveredUser = true (Widget: Top 5 Usuarios Recuperados)
-- ============================================================================
RAISE NOTICE '=== CONCEPTO 2: IsRecoveredUser = true ===';
RAISE NOTICE 'Usuarios marcados explícitamente como recuperados';
SELECT
'IsRecoveredUser = true' as concepto,
COUNT(DISTINCT client_mac) as total_usuarios_unicos,
COUNT(*) as total_conexiones,
COUNT(DISTINCT CASE WHEN user_id > 0 THEN user_id END) as usuarios_con_id
FROM splash_wifi_connection_report
WHERE is_recovered_user = true
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted;
-- Detalle de usuarios recuperados
SELECT
user_id,
client_mac,
user_name,
email,
loyalty_type,
is_recovered_user,
COUNT(*) as total_conexiones,
MIN(connection_date) as primera_conexion,
MAX(connection_date) as ultima_conexion,
days_inactive
FROM splash_wifi_connection_report
WHERE is_recovered_user = true
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted
AND user_id > 0 -- El widget TopRetrievedUsers filtra por user_id > 0
GROUP BY user_id, client_mac, user_name, email, loyalty_type, is_recovered_user, days_inactive
ORDER BY total_conexiones DESC
LIMIT 10;
-- ============================================================================
-- CONCEPTO 3: Recovery Rate (usuarios inactivos que regresaron)
-- ============================================================================
RAISE NOTICE '=== CONCEPTO 3: Recovery Rate - Usuarios Inactivos que Regresaron ===';
RAISE NOTICE 'Lógica compleja: usuarios que estuvieron inactivos y luego regresaron';
-- Usuarios que tienen recovery_connection_date (fecha de recuperación)
SELECT
'Usuarios con recovery_connection_date' as concepto,
COUNT(DISTINCT client_mac) as total_usuarios_unicos,
COUNT(*) as total_conexiones,
AVG(days_inactive) as promedio_dias_inactivos
FROM splash_wifi_connection_report
WHERE recovery_connection_date IS NOT NULL
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted;
-- Detalle de usuarios con recovery_connection_date
SELECT
client_mac,
user_name,
email,
loyalty_type,
recovery_connection_date,
days_inactive,
COUNT(*) as total_conexiones,
MIN(connection_date) as primera_conexion,
MAX(connection_date) as ultima_conexion
FROM splash_wifi_connection_report
WHERE recovery_connection_date IS NOT NULL
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted
GROUP BY client_mac, user_name, email, loyalty_type, recovery_connection_date, days_inactive
ORDER BY days_inactive DESC
LIMIT 10;
-- ============================================================================
-- RESUMEN COMPARATIVO DE LOS 3 CONCEPTOS
-- ============================================================================
RAISE NOTICE '=== RESUMEN COMPARATIVO ===';
SELECT
'LoyaltyType Recurrent' as concepto,
COUNT(DISTINCT client_mac) as usuarios_unicos,
COUNT(*) as total_conexiones
FROM splash_wifi_connection_report
WHERE loyalty_type = 'Recurrent'
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted
UNION ALL
SELECT
'IsRecoveredUser = true' as concepto,
COUNT(DISTINCT client_mac) as usuarios_unicos,
COUNT(*) as total_conexiones
FROM splash_wifi_connection_report
WHERE is_recovered_user = true
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted
UNION ALL
SELECT
'Recovery Date NOT NULL' as concepto,
COUNT(DISTINCT client_mac) as usuarios_unicos,
COUNT(*) as total_conexiones
FROM splash_wifi_connection_report
WHERE recovery_connection_date IS NOT NULL
AND connection_date BETWEEN start_date AND end_date
AND NOT is_deleted;
-- ============================================================================
-- INTERSECCIÓN: ¿Cuántos usuarios cumplen MÚLTIPLES conceptos?
-- ============================================================================
RAISE NOTICE '=== INTERSECCIÓN DE CONCEPTOS ===';
SELECT
CASE
WHEN loyalty_type = 'Recurrent' AND is_recovered_user = true AND recovery_connection_date IS NOT NULL
THEN 'Los 3 conceptos'
WHEN loyalty_type = 'Recurrent' AND is_recovered_user = true
THEN 'Recurrent + IsRecovered'
WHEN loyalty_type = 'Recurrent' AND recovery_connection_date IS NOT NULL
THEN 'Recurrent + RecoveryDate'
WHEN is_recovered_user = true AND recovery_connection_date IS NOT NULL
THEN 'IsRecovered + RecoveryDate'
WHEN loyalty_type = 'Recurrent'
THEN 'Solo Recurrent'
WHEN is_recovered_user = true
THEN 'Solo IsRecovered'
WHEN recovery_connection_date IS NOT NULL
THEN 'Solo RecoveryDate'
ELSE 'Ninguno'
END as categoria,
COUNT(DISTINCT client_mac) as usuarios_unicos,
COUNT(*) as total_conexiones
FROM splash_wifi_connection_report
WHERE connection_date BETWEEN start_date AND end_date
AND NOT is_deleted
AND (
loyalty_type = 'Recurrent'
OR is_recovered_user = true
OR recovery_connection_date IS NOT NULL
)
GROUP BY categoria
ORDER BY usuarios_unicos DESC;
-- ============================================================================
-- RECOMENDACIÓN: ¿Qué campo usar para cada widget?
-- ============================================================================
RAISE NOTICE '=== RECOMENDACIONES ===';
RAISE NOTICE '';
RAISE NOTICE '1. Widget "Usuarios Recuperados" (contador simple):';
RAISE NOTICE ' → Usar: loyalty_type = ''Recurrent''';
RAISE NOTICE ' → Motivo: Campo estándar de clasificación de usuarios';
RAISE NOTICE '';
RAISE NOTICE '2. Widget "Top 5 Usuarios Recuperados" (ranking):';
RAISE NOTICE ' → Usar: is_recovered_user = true AND user_id > 0';
RAISE NOTICE ' → Motivo: Marca explícita + necesita user_id para agrupar';
RAISE NOTICE '';
RAISE NOTICE '3. Widget "Tasa de Recuperación" (métrica compleja):';
RAISE NOTICE ' → Usar: recovery_connection_date IS NOT NULL';
RAISE NOTICE ' → Motivo: Calcula % de usuarios inactivos que regresaron';
END $$;
-- ============================================================================
-- QUERY RÁPIDO PARA DEBUGGING
-- ============================================================================
-- Ver ejemplo de un usuario que cumple múltiples conceptos
SELECT
client_mac,
user_name,
email,
loyalty_type,
is_recovered_user,
recovery_connection_date,
days_inactive,
connection_date,
connection_date_time
FROM splash_wifi_connection_report
WHERE (loyalty_type = 'Recurrent'
OR is_recovered_user = true
OR recovery_connection_date IS NOT NULL)
AND NOT is_deleted
ORDER BY connection_date DESC
LIMIT 20;