Avatar billede morten_s Nybegynder
27. august 2001 - 08:09 Der er 32 kommentarer og
2 løsninger

SQL streng

Jeg har en tabel med nogle 5 min tællinger som ser ud som følger

Id  CntDateTime          Cnt1
1  2001-08-01 00:05:00    12
2  2001-08-01 00:10:00    11
3  2001-08-01 00:15:00    10
4  2001-08-01 00:20:00    0
5  2001-08-01 00:25:00    6
6  2001-08-01 00:30:00    14
7  2001-08-01 00:35:00    11
.
.

Nu vil jeg gerne lave et SELECT så jeg istedet for 15. min. tællinger.

Resultatet af mit SELECT skal altså se ud som her

  CntDateTime          Cnt1
  2001-08-01 00:05:00    33
  2001-08-01 00:20:00    20
  2001-08-01 00:35:00    xx
  .
  .

Håber en SQL haj kan droppe SQL strengen

mvh
Morten
Avatar billede teepee Nybegynder
27. august 2001 - 08:12 #1
Umiddelbart kan jeg ikke finde en løsning, så jeg glæder mig til at se evt. besvarelser. I stedet ville jeg nok vælge en sorteret cursor og loope igennem.
Avatar billede morten_s Nybegynder
27. august 2001 - 08:13 #2
Brugbare forslag også uden brug af SELECT modtages
Avatar billede runesoft Nybegynder
27. august 2001 - 09:52 #3
det kan muligvis gøres mere elegant :-)

SELECT Sum(test.count) AS hmm  FROM test
GROUP BY (Year([CntDate]) & Month([CntDate]) & Day([CntDate]) & Hour([CntDate]) & int(Minute([CntDate]) / 15) & Second([CntDate]));
Avatar billede runesoft Nybegynder
27. august 2001 - 09:53 #4
testet i access.
Avatar billede runesoft Nybegynder
27. august 2001 - 09:58 #5
hov.... sorry:

SELECT Sum([test].[count]) AS hmm, Year([CntDate]) & Month([CntDate]) & Day([CntDate]) & Hour([CntDate]) & int(Minute([CntDate])-Minute([CntDate]) Mod 15) & Second([CntDate])
FROM test
GROUP BY Year([CntDate]) & Month([CntDate]) & Day([CntDate]) & Hour([CntDate]) & int(Minute([CntDate])-Minute([CntDate]) Mod 15) & Second([CntDate]);
Avatar billede runesoft Nybegynder
27. august 2001 - 10:00 #6
SELECT Sum([test].[count]) AS hmm, Year([CntDate]) & Month([CntDate]) & Day([CntDate]) & Hour([CntDate]) & Minute([CntDate])-(Minute([CntDate]) Mod 15)
FROM test
GROUP BY (Year([CntDate]) & Month([CntDate]) & Day([CntDate]) & Hour([CntDate]) & Minute([CntDate])-(Minute([CntDate]) Mod 15));
Avatar billede runesoft Nybegynder
27. august 2001 - 10:37 #7
Hvis du er lidt performance orienteret, vil jeg anbefale at du laver et ekstrafelt i din database hvor du putter dataene jeg grouperede ind i. Så skal databasen ikke regne feltet ud hver gang det skal vises.

altså:

update tabel set tempdate=(Year([CntDate]) & Month([CntDate]) & Day([CntDate]) & Hour([CntDate]) & Minute([CntDate])-(Minute([CntDate]) Mod 15))

og så groupere på det i udtrækket
Avatar billede morten_s Nybegynder
27. august 2001 - 10:55 #8
runesoft> Har prøvet din SQL streng af, jeg har en MySql database, den melder desværre fejl tilbage, tror du at noget af syntaksen skal være anderledes ?
Avatar billede runesoft Nybegynder
27. august 2001 - 11:13 #9
prøv med: GROUP BY Year([CntDate]), Month([CntDate]), Day([CntDate]), Hour([CntDate]), (Minute([CntDate])-Minute([CntDate]) Mod 15)
Avatar billede morten_s Nybegynder
27. august 2001 - 11:53 #10
Det går allerede galt i SELECT statementet, min tabel heder Counter så jeg skriver:

SELECT Sum(counter.count) AS hmm, Year(CntDate) & Month(CntDate) & Day(CntDate) & Hour(CntDate) & int(Minute(CntDate)-Minute(CntDate) Mod 15) & Second(CntDate)
FROM counter

De steder hvor der står CntDate, skal der da ikke stå CntDayTime ?

og Count er et reserveret ord i MySql, så måske går det galt med Sum(counter.count)

Avatar billede morten_s Nybegynder
27. august 2001 - 11:53 #11
Skal Cnt1 ikke indgå i statementet ?
Avatar billede runesoft Nybegynder
27. august 2001 - 11:55 #12
du skal selvfølgelig erstatte CntDatec med CntDayTime og count med Cnt1
Avatar billede runesoft Nybegynder
27. august 2001 - 11:55 #13
du skal selvfølgelig erstatte CntDate med CntDayTime og count med Cnt1
Avatar billede morten_s Nybegynder
27. august 2001 - 12:01 #14
Se det hjælper lidt, nu laver den vrøvl over denne del
int(Minute(CntDateTime)-Minute(CntDateTime) Mod 15)
Avatar billede runesoft Nybegynder
27. august 2001 - 12:15 #15
ok... jeg ved ikke 100% hvad der virker på mysql, men prøv dette:
Minute(CntDateTime)-Minute(CntDateTime) % 15
Avatar billede morten_s Nybegynder
27. august 2001 - 12:20 #16
Jeg tror måske nærmere at det er typecasten til int, det går galt med
Avatar billede runesoft Nybegynder
27. august 2001 - 12:21 #17
den er ikke nødvendig :-)
Avatar billede morten_s Nybegynder
27. august 2001 - 12:25 #18
Jeg har nu følgende

SELECT Sum(counter.cnt1) AS hmm, Year(CntDateTime) And Month(CntDateTime) And Day(CntDateTime) And Hour(CntDateTime) And (Minute(CntDateTime)-Minute(CntDateTime) Mod 15) And Second(CntDateTime)
FROM counter
GROUP BY Year(CntDateTime), Month(CntDateTime), Day(CntDateTime), Hour(CntDateTime), (Minute(CntDateTime)-Minute(CntDateTime) Mod 15)


Jeg indsætter strengen i en SQL editor som kender de reserverede ord (de markeres med blåt), og jeg kan se at den kender Year  og Month men ikke Day ?
Avatar billede runesoft Nybegynder
27. august 2001 - 12:39 #19
i følge mysqldocumentationen er der en todays funktion:
to_days(CntDateTime),Hour(CntDateTime), (Minute(CntDateTime)-Minute(CntDateTime) Mod 15)

men hvis alle dine udtrukkede poster er inden for samme døgn, behøver du ikke at bekymre dig om datoen.

Hvis jeg skal arbejde videre med dette, vil jeg kræve nogle flere point :-)
Avatar billede runesoft Nybegynder
27. august 2001 - 12:43 #20
Mod skal være %
Avatar billede morten_s Nybegynder
27. august 2001 - 12:44 #21
Point tal hermed fordobblet ;-))

Jeg tror også vi nærmer os nu.

Den fejl jeg får nu siger SQL error near MOD 15, jeg kan se at MySql kender Mod og ikke %



Avatar billede runesoft Nybegynder
27. august 2001 - 12:46 #22
så vidt jeg kan se skal
Minute(CntDateTime) % 15
være det samme som
Mod(Minute(CntDateTime), 15)
Avatar billede morten_s Nybegynder
27. august 2001 - 13:31 #23
Har nu følgende:

SELECT Sum(counter.cnt1) AS hmm, Year(CntDateTime) And Month(CntDateTime) And To_Days(CntDateTime)
      And Hour(CntDateTime) And (Minute(CntDateTime)-Mod(Minute(CntDateTime), 15) And Second(CntDateTime)
FROM counter
GROUP BY Year(CntDateTime), Month(CntDateTime), To_Days(CntDateTime), Hour(CntDateTime),
        (Minute(CntDateTime)-Mod(Minute(CntDateTime), 15)

Fejlen er nu near FROM counter
Avatar billede morten_s Nybegynder
27. august 2001 - 13:33 #24
Men  jeg har nu svært ved at se hvordan Sum(counter.cnt1) AS hmm
bliver til en sammenlægning af de tre efterfølgende. Måske du kunne forklare lidt, så kan jeg bedre fejlfinde selv.

skal AS hmm ikke bruges i den efterfølgende kode ?
Avatar billede runesoft Nybegynder
27. august 2001 - 13:39 #25
du kan jo prøve følgende:

SELECT Sum(counter.cnt1) AS hmm FROM counter
GROUP BY Year(CntDateTime), Month(CntDateTime), To_Days(CntDateTime), Hour(CntDateTime),(Minute(CntDateTime)-Mod(Minute(CntDateTime), 15)

hmm er bare et navn, du kan bruge til at refererer til summen, bagefter
Avatar billede morten_s Nybegynder
27. august 2001 - 14:18 #26
SELECT Sum(counter.cnt1) AS hmm FROM counter
virker fint, giver den totale sum af Cnt1

SELECT Sum(counter.cnt1) AS hmm FROM counter
GROUP BY Year(CntDateTime), Month(CntDateTime), To_Days(CntDateTime), Hour(CntDateTime),(Minute(CntDateTime)-Mod(Minute(CntDateTime), 15)
Virker ikke giver SQL fejl


Avatar billede runesoft Nybegynder
27. august 2001 - 14:28 #27
hvad med

SELECT Sum(counter.cnt1) AS hmm FROM counter
GROUP BY Year(CntDateTime) AND Month(CntDateTime) AND To_Days(CntDateTime) AND Hour(CntDateTime) AND (Minute(CntDateTime)-Mod(Minute(CntDateTime), 15)
Avatar billede morten_s Nybegynder
27. august 2001 - 14:34 #28
Desværre ikke, jeg tror jeg vil hjem og læse på GROUP BY commandoen
Avatar billede runesoft Nybegynder
27. august 2001 - 14:36 #29
Ked af at jeg ikke er bedre til MySQL. :-)  Ellers skift til access eller sql2000 :-)))
Avatar billede morten_s Nybegynder
29. august 2001 - 13:45 #30
Jeg har afsat lidt flere point til den rigtige løsning (RuneSoft du skal nok få din del af pointene)
Avatar billede morten_s Nybegynder
29. august 2001 - 21:27 #31
Den rigtige MySql streng er fundet:

select concat(left(CntDateTime,14), round(minute(CntDateTime) /15) *15) as dt,
sum(Cnt1) as cnt
from counter
group by dt

Runesoft> Tak for hjælpen
Avatar billede morten_s Nybegynder
29. august 2001 - 21:28 #32
Runesoft> Kan du ikke ligge et svar ind så du kan få dine velfortjente point ?
Avatar billede runesoft Nybegynder
30. august 2001 - 09:37 #33
her er et... Får den kun for én time, eller for alle?
Avatar billede morten_s Nybegynder
30. august 2001 - 21:06 #34
Som brødre vi dele
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester