[SQL] Group By + Datas: Será impossível?

5 respostas
saoj

Pergunta simples, resposta complicada.

Quero retornar o número de cadastros nos últimos 10 dias via group by.

Problema: Não houve cadastros em alguns dias, logo aparecem buracos no meu result set.

mysql> select count(1), date(regdate) reg from users where regdate > date(now()) - 10 group by reg order by reg desc;
±---------±-----------+
| count(1) | reg |
±---------±-----------+
| 12 | 2008-02-26 |
| 16 | 2008-02-25 |
| 25 | 2008-02-24 |
| 46 | 2008-02-23 |
| 87 | 2008-02-22 |
| 195 | 2008-02-21 |
| 1 | 2008-02-20 |
±---------±-----------+

Solução via bacalhau: (tenho que subtrair 1 de todas as datas)

mysql> select sum(t), m from (

-> select count(1) t, date(regdate) m from users where regdate > date(now()) - 10 group by m

-> UNION ALL

-> select 1,t.d d from (

-> select date(now()) d from dual union

-> select date(date(now()) - 1) d from dual union

-> select date(date(now()) - 2) d from dual union

-> select date(date(now()) - 3) d from dual union

-> select date(date(now()) - 4) d from dual union

-> select date(date(now()) - 5) d from dual union

-> select date(date(now()) - 6) d from dual union

-> select date(date(now()) - 7) d from dual union

-> select date(date(now()) - 8) d from dual union

-> select date(date(now()) - 9) d from dual

-> ) t) tt group by m order by m desc;

±-------±-----------+

| sum(t) | m          |

±-------±-----------+

|     13 | 2008-02-26 |

|     17 | 2008-02-25 |

|     26 | 2008-02-24 |

|     47 | 2008-02-23 |

|     88 | 2008-02-22 |

|    196 | 2008-02-21 |

|      2 | 2008-02-20 |

|      1 | 2008-02-19 |

|      1 | 2008-02-18 |

|      1 | 2008-02-17 |

±-------±-----------+

10 rows in set (0.01 sec)

Alguém saberia uma solução mais bela para isso em SQL ???

5 Respostas

netShot

pq nao tenta usar um limit ai ?

digamos que voce conta de um periodo de 30 dias, mas exibe somente 10… sera que nao fica melhor ?

saoj

Limit não tem muito haver com o problema.

O problema é que eu quero dar um group by e incluir as datas que não retornam nada…

peczenyj

Hum…

Que tal vc selecionar as ultimas 10 datas distintas do banco de dados e usar isso numa subquery?

select count(1), date(regdate) reg from users where regdate in (select dist date(regdate) x from users order by x desc limit 10) group by reg order by reg desc

essa parte do in eu tenho minhas duvidas se não pode ser um pouco mais performatica de outra forma (usando group/having count sei la).

saoj

Vc está assumindo que eu vou ter todas as datas na minha tabela… Isso não é legal…

Rubem_Azenha

select count(1) from users where reg_date between now() and (now() - 10) group by reg order by reg desc ?

Criado 26 de fevereiro de 2008
Ultima resposta 26 de fev. de 2008
Respostas 5
Participantes 4