2010-06-10 12 views
5

che sto usando MySQL e ho la seguente tabella:Gruppo per intervallo di date settimane/mesi intervallo

| clicks | int | 
| period | date | 

voglio essere in grado di generare report come questo, in cui periodi sono fatto negli ultimi 4 settimane:

| period | clicks | 
| 1/7 - 7/5 | 1000 | 
| 25/6 - 31/7 | .... | 
| 18/6 - 24/6 | .... | 
| 12/6 - 18/6 | .... | 

o negli ultimi 3 mesi:

| period | clicks | 
| July | .... | 
| June | .... | 
| April | .... | 

Tutte le idee come fare query di selezione che possono generare l'equivale nt intervallo di date e numero di clic?

+1

Memorizzare la data come int? Come appare quel campo? – simendsjo

+0

@simendsjo Formattazione confusa - Ho pensato la stessa cosa ma ho letto non giù! –

+0

scusate per quell'errore, è un periodo chiamato periodo con tipo data. – khelll

risposta

11
 
SELECT 
WEEKOFYEAR(`date`) AS period, 
SUM(clicks) AS clicks 
FROM `tablename` 
WHERE `date` >= CURDATE() - INTERVAL 4 WEEK 
GROUP BY period 

SELECT 
MONTH(`date`) AS period, 
SUM(clicks) AS clicks 
FROM `tablename` 
WHERE `date` >= CURDATE() - INTERVAL 3 MONTH 
GROUP BY period 

+0

Questo è un controllo migliore per il periodo, ho corretto la mia risposta per rispecchiarlo. – Keeper

+0

Per curiosità, come dovrebbero essere le query se il campo periodo è un numero intero come 20100609 che corrisponde alla data 2010-06-09. La performance sarebbe migliore in un tipo così int? – khelll

+0

Probabilmente solo se è necessario filtrare un intervallo di date perché non è possibile filtrare per settimana (è comunque necessario eseguire il cast come data). E ricordati di scegliere una risposta: P – Keeper

3

Per gli ultimi 3 mesi è possibile utilizzare:

SELECT MONTH(PERIOD), SUM(CLICKS) 
FROM TABLE 
WHERE PERIOD >= NOW() - INTERVAL 3 MONTH 
GROUP BY MONTH(PERIOD) 

o per le ultime 4 settimane:

SELECT WEEK(PERIOD), SUM(CLICKS) 
FROM TABLE 
WHERE PERIOD >= NOW() - INTERVAL 4 WEEK 
GROUP BY WEEK(PERIOD) 

codice non testato.

+0

Non so se l'ottimizzatore funziona con WEEK (Period) senza controllare tutte le date nel risultato. Ecco perché mi piace usare WEEK (Period) AS WeekPeriod, Group by WeekPeriod – simendsjo

+0

Io uso principalmente Oracle per cui devi raggruppare per lo stesso campo selezionato (non puoi aliasare un campo e raggruppare per quello). Penso che internamente la query sia la stessa. – Keeper

Problemi correlati