Wpis z mikrobloga

[ #mysql #sql ]

mirki, z sql zazwyczaj nie mam problemu, ale chyba utkąłem.

w tabeli są dwie kolumny: godzina [time] i liczba [int]. pytanie: jak pogrupować dane po godzinie do dwóch stref czasowych 00:00:00 - 11:00:00 i 12:00:00 - 23:00:00 żeby zliczyć sumę liczb w obu tych zakresach godzin? przyświeca mi idea z podzapytaniem w leftjoin do samej sobie, ale skomplikowanie rozwiązania znacznie przewyższa wartość "projektu" ;)
  • 13
@RomantycznyRoman: teoretyczne tak, ale do każdego zakresu godzin będą jeszcze dwa joiny - słabo z wydajnością.

@StaryHipopotam: w dwóch rekordach sumę liczb z poszczególnych zakresów

myślę jeszcze nad widokiem z tabeli i dołożeniem wirtualnej kolumny "strefa", po której będę grupował dodatkowo
@tomix:

select

(select sum( liczba) from ble where godzina< 11) as poludnie,

(select sum( liczba) from ble where godzina > 11) as popoludnie

from ble limit 1

z dupy napisane ale raczej zadziała
@tomix: to ja bym to zrobił z union. Nie wydaje mi się, żeby była istotna różnica w wydajności między zapytaniem z UNION ALL (czyli de facto dwa selecty) a podzapytaniem w left join. Zwłaszcza jeżeli niski budżet. :)

Ale przy podzapytaniu miałbyś przecież jeden rekord i dwie kolumny (?), więc nie bardzo łapię chyba. Chyba że nie skumałem, o co chodziło na początku, to sorry.
@RomantycznyRoman: @StaryHipopotam: może faktycznie zbyt jasno się nie wyraziłem, w praktyce wygląda to tak: w bazie co godzinę jest rejestrowane zużycie energii elektrycznej. data insertu + zużycie. trzeba z tego zrobić trzy grupy taryfowe, zsumować zużycie całkowite w nich na przestrzeni dnia i robiąc joina do tabeli z cennikiem wyliczyć różne kwoty dla tego samego oczywiście zużycia, ale dla różnych grup taryfowych.

zrobiłem to w ten sposób:

CASE

WHEN HOUR(pomiarOd)
@tomix: Przy takim przyroście to bez różnicy - każde rozwiązanie będzie dobre - i union i case. Ewentualnie możesz zrobić triggera on insert, który będzie ustawiał z automatu strefę czasową - odpytanie takiego widoku będzie szybsze (o ułamki sekund - mając na uwadze liczbę danych) i przeniesiesz kod na tabele. Ale to bardziej sztuka dla sztuki.

BTW - zamiast rozpisywać drugiego whena w case, możesz zrobić else.
@plushy: wielkie dzięki, właśnie o to chodziło. szukałem na stronie oracla jakiegoś rozszerzenia do group by, ale na darmo. właśnie tego było mi trzeba!