2013-03-22 16 views
7

Próbuję uzyskać liczbę wierszy z tabeli MySQL, w której dane są pogrupowane według TYGODNIA.Zwróć liczbę wierszy pogrupowanych według tygodnia MySQL

Dotychczas zapytanie mam to:

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

Ta kwerenda zwraca dane poniżej:

enter image description here

Jak widać, te tygodnie nie są poprawne, ja oczekuję dane za każdy tydzień, począwszy od poniedziałku 7 stycznia (7,14,21,28,4,11 itd.) i trwające do tego tygodnia.

Próbowałem również zmodyfikowaną wersję zapytania 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) 

ta zwraca podobne wyniki jak w pierwszym zapytaniu.

Być może istnieje niezgodność z niektórymi danymi przechowywanymi w kolumnie DATETIME: twitTimeExtracted w kilku wierszach danych? Naprawdę nie wiem, że nie mam dużego doświadczenia z MySQL.

Każda pomoc będzie naprawdę doceniona.

Dzięki

+1

Więc co tydzień liczba był poniedziałek 07 stycznia? Jaki numer tygodnia był w poniedziałek 1 stycznia? Może spróbuj: "grupuj według tygodnia (twitTimeExtracted, 1)" – Strawberry

+0

_how_ jest to nieprawidłowe? Czy spodziewasz się magicznej daty rozpoczęcia tygodnia? (BTW, zgrupowałbym na 'YEAR()' too ..) – Wrikken

Odpowiedz

14

ten przekształca datetime wartość do odpowiedniego poniedziałku tygodnia

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

yearweek zwraca zarówno tydzień, jak i rok. Razem z ciągiem monday, str_to_date podajemy poniedziałkową wartość datetime.

Jeśli Twój tydzień zaczyna się od Monday, użyj zamiast tego yearweek(twitTimeExtracted, 1).

+0

To zadziałało! dziękuję wszystkim, którzy pomogli! – user1814487

+0

Czy to nie działa, gdy daty pochodzą z różnych lat? – NateS

+1

@NateS Nie sądzę. 'yearweek' dostarcza zarówno rok *, jak i * tydzień, więc powinno działać, nawet jeśli masz wiele lat w swoim zbiorze danych. Zobacz zaktualizowaną odpowiedź. –

0

Jedną z opcji, aby zawsze uzyskać poniedziałek w tygodniu jest użycie 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

dzięki, to zapytanie tworzy ~ 19 000 wierszy wyników. wyniki tygodniowo nie są skondensowane do liczby wierszy wyników. – user1814487

+0

@ user1814487 - nie wiesz, dlaczego widziałeś Fiddle SQL? Nie tak jak się spodziewano? – sgeddes

+0

Skrzypce SQL działają zgodnie z oczekiwaniami. Wierzę jednak, że po uruchomieniu zapytania na moim serwerze otrzymuję wszystkie wyniki z tygodnia zwróconego z datą jako pierwszego dnia miesiąca i godziny oraz 1 w liczniku (*) kolumna: na przykład http://i.imgur.com/kMMIAel.png – user1814487

0

spróbuj tego:

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

dziękuję, ale to powoduje błędy: "Masz błąd w składni SQL, sprawdź instrukcja, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu 'day, datediff (' 7 sty 2012 ', twitTimeExtracted)) Mod 7 FROM scene.twitData ' w linii 2 " – user1814487

0

Alternatywnym rozwiązaniem:

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

Np

SELECT DATE(DATE_SUB(DATE("2016-04-11"), INTERVAL WEEKDAY(DATE("2016-04-11")) DAY)); 
Powiązane problemy