2013-03-22 14 views
7

Sto cercando di ottenere il conteggio delle righe da una tabella MySQL in cui i dati sono raggruppati per WEEK.Restituisce il conteggio delle righe raggruppate per settimana MySQL

Finora la domanda che ho è:

"SELECT count(*) as tweets, twitTimeExtracted as date 
    FROM scene.twitData 
    group by week(twitTimeExtracted)" 

Questa query restituisce i dati di seguito:

enter image description here

Come si può vedere, le settimane non sono corretti, mi aspetto dati per ogni settimana a partire da lunedì 7 gennaio (7,14,21,28,4,11, ecc.) e fino a questa settimana.

Ho provato anche una versione modificata della query orignal:

SELECT count(*) as tweets, twitTimeExtracted as date 
FROM scene.twitData 
WHERE date(twitTimeExtracted) 
    BETWEEN '2013-01-07' and '2013-03-11' 
group by week(twitTimeExtracted) 

Ciò restituisce risultati simili come la prima query.

Forse c'è un'incongruenza con alcuni dati memorizzati nel DATETIME: colonna twitTimeExtracted su poche righe di dati? Non so davvero di non avere molta esperienza con MySQL.

Qualsiasi aiuto sarebbe davvero apprezzato.

Grazie

+1

Quindi, quale numero settimana è stata Lunedi 7 gennaio? Quale numero della settimana era lunedì 1 gennaio? Forse prova: "group by week (twitTimeExtracted, 1)" – Strawberry

+0

_how_ è errato? Ti aspetti di apparire una data magica di inizio settimana? (A proposito, vorrei raggruppare su 'YEAR()' anche ..) – Wrikken

risposta

14

Questo converte il datetime valore per il lunedì appropriato della settimana

select count(*) as tweets, 
     str_to_date(concat(yearweek(twitTimeExtracted), ' monday'), '%X%V %W') as `date` 
from twitData 
group by yearweek(twitTimeExtracted) 

yearweek restituisce sia la settimana che l'anno. Insieme alla stringa monday, str_to_date fornisce il valore datetime del lunedì.

Se la settimana inizia il Monday, utilizzare invece yearweek(twitTimeExtracted, 1).

+0

Questo ha funzionato! grazie a tutti quelli che hanno aiutato! – user1814487

+0

Non fallisce quando le date sono di anni diversi? – NateS

+1

@NateS Non penso. 'yearweek' consegna sia l'anno * che * settimana, quindi dovrebbe funzionare, anche se hai più anni nel set di dati. Si prega di consultare la risposta aggiornata. –

0

Una possibilità di ottenere sempre il Lunedi della settimana è quello di utilizzare ADDDATE:

SELECT count(*) as tweets, adddate(twitTimeExtracted, INTERVAL 2-DAYOFWEEK(twitTimeExtracted) DAY) 
FROM twitData 
WHERE date(twitTimeExtracted) 
    BETWEEN '2013-01-07' and '2013-03-11' 
GROUP BY adddate(twitTimeExtracted, INTERVAL 2-DAYOFWEEK(twitTimeExtracted) DAY) 

SQL Fiddle Demo

+0

grazie, questa query produce ~ 19.000 righe di risultati. i risultati settimanali non sono condensati in un conteggio di righe di risultato. – user1814487

+0

@ user1814487 - Non so perché, hai visto SQL Fiddle? Non come previsto? – sgeddes

+0

Il violino di SQL funziona come previsto, credo tuttavia quando eseguo la query sul mio server, ottengo tutti i risultati della settimana restituita con la data come il primo giorno del mese e l'ora e un 1 nel conteggio (* colonna: ad esempio http://i.imgur.com/kMMIAel.png – user1814487

0

provare questo:

SELECT count(*) as tweets, 
    date_add('7 Jan 2012', day, datediff('7 Jan 2012', twitTimeExtracted)) % 7 
FROM scene.twitData 
group by date_add('7 Jan 2012', day, datediff('7 Jan 2012', twitTimeExtracted)) % 7 
+0

grazie ma questo fa prendere a calci gli errori: "Hai un errore nella sintassi SQL, controlla il manuale che corrisponde alla versione del server MySQL per la sintassi corretta da utilizzare vicino a 'day, datediff (' 7 gen 2012 ', twitTimeExtracted)) Mod 7 FROM scene.twitData ' alla riga 2 " – user1814487

0

Una soluzione alternativa:

SELECT DATE(DATE_SUB(yourDate, INTERVAL WEEKDAY(yourDate) DAY)); 

Esempio:

SELECT DATE(DATE_SUB(DATE("2016-04-11"), INTERVAL WEEKDAY(DATE("2016-04-11")) DAY)); 
Problemi correlati