2010-01-11 10 views
16

Estoy intentando descubrir algunas estadísticas de ventanas deslizantes para mis usuarios. Tengo una tabla con un usuario y columnas como created_at y verified_at. Para cada mes, me gustaría saber cuántos usuarios se registraron (un grupo simple por date_trunc del created_at), y luego de esas personas, cuántas verificadas dentro de mi ventana deslizante (llámalo 60 días).Consulta SQL para sumar condicionalmente en función de la ventana de fecha de movimiento

me gustaría hacer una consulta SQL que me da algo así como:

Month | Registered | Verified in 60 days 
Jan 2009 | 1543  | 107 
Feb 2009 | 2000  | 250 

estoy usando PostgreSQL. Empiezo a buscar la suma (caso ...), pero no sé si puedo hacer que mi caso dependa de algún modo del date_trunc.

Esto no funciona, por supuesto, pero aquí es la idea:

SELECT DATE_TRUNC('month', created_at) as month, 
COUNT(*) as registered, 
SUM(CASE WHEN verified_at < month+60 THEN 1 ELSE 0 END) as verified 
FROM users 
GROUP BY DATE_TRUNC('month', created_at) 
+0

¿Qué versión de PostgreSQL se utilizan? –

+0

Estoy usando 8.3.5 – teich

Respuesta

21
SELECT COUNT(created_at) AS registered, 
     SUM(CASE WHEN verified_at <= created_at + '60 day'::INTERVAL THEN 1 ELSE 0 END) AS verified 
FROM generate_series(1, 20) s 
LEFT JOIN 
     users 
ON  created_at >= '2009-01-01'::datetime + (s || ' month')::interval 
     AND created_at < '2009-01-01'::datetime + (s + 1 || ' month')::interval 
GROUP BY 
     s 
+0

Eso es increíble. Terminé dejando de lado la serie, y solo uso tu intervalo en el código anterior, que funciona muy bien. – teich

+0

'@ teich': la serie se asegura de que no queden espacios vacíos si no hay usuarios en ningún mes. – Quassnoi

0

Tal vez podría unión entre sí los diferentes meses del año.

select sum(whatever), 'january' from user where month = 'january' 
union all 
select sum(whatever), 'february' from user where month = 'february' 
... 
+0

La clave es que no quiero enumerar los meses en la consulta SQL, ya que no sé cuántos meses tengo. Esta es una consulta que se ejecutará todos los días, durante meses (o años) a medida que ingresen datos nuevos. – teich

0
SELECT 
    MONTH, 
    COUNT(*) AS Registered, 
    SUM (CASE WHEN datediff(day,reg_date,ver_date) < 60 THEN 1 ELSE 0) as 'Verified in 60 //days datediff is an MSSQL function amend for postgresql' 
FROM 
    TABLE 
GROUP BY 
    MONTH 
Cuestiones relacionadas