Avatar billede sub_zero Nybegynder
24. september 2008 - 13:33 Der er 7 kommentarer og
1 løsning

Query pr. dag med RANK-gruppering

Hej alle,

Jeg har pt. gang i at lave et temmelig avanceret SQL query til en SQL2005-database.

Jeg har en tabel indeholdende flg. struktur:
GroupID (int)
Created (datetime)
Value (decimal)

GroupID kan optræde flere gange i tabellen, men med forskellige Created-tidspunkter.

Det jeg gerne vil er, at jeg for en given group vil have det Value ud som ligger tættest på et bestemt klokkeslæt over en given datoperiode.

Jeg er selv kommet frem til følgende udtryk, men som alligevel fejler fordi det ikke giver kun giver mig det Value som er tættest på - men det er på rette spor, mener jeg.

http://pastebin.com/m783bcd78

Jeg anvender en table-valued function som blot returnerer mig én row pr. dato mellem d. 26/08 og 27/08 i det ovenstående eksempel (altså 2 records).
I eksemplet vil jeg have værdien tættest på klokken 11:00 på den givne dato - altså vil jeg have to records ud, så der skal på en eller anden måde grupperes på dato.

Det skal gerne ende op med, at jeg i sidste ende har en table-valued function, som jeg kan kalde via noget alá:
GetDailyValues(GroupID, StartDato, SlutDato, Klokkeslæt)

Håber jeg har gjort mig forståelig og at der er nogle guruer derude, som kan hitte rede i det :)
Avatar billede Syska Mester
24. september 2008 - 15:02 #1
Klokkenslet skal vel være en DateTime ...

En lille tanke der kom til mig ude at have noget kode ...

Start
Slut
DateTime du vil ramme ...

Og så have en funktion der regner antal sekunder ud til de forskellige CreateTimes og altid sørge for det bliver et positivt tal .... derefter lave en ORDER BY på den værdi ... den som er mindst er så tætest på det tidspunkt du søger :-)

Kun en tanke ...

// ouT
Avatar billede fn1977 Nybegynder
24. september 2008 - 15:46 #2
Denne linje giver alle der er større en datoen 2006-05-05
i gruppe 3

SELECT * from grouporder
  where GroupID = 3 AND Created >= '2006-05-05'

hvis du kun vil have én skal du bare skrive top(1) foran * og så får du kun den ene der er over. skal der også order på enten asc eller desc.. asc giver den lige over desc giver den ældste..

SELECT top(1) * from grouporder
  where GroupID = 1 AND Created >= '2006-05-05'
  order by Created asc
Avatar billede sub_zero Nybegynder
24. september 2008 - 15:53 #3
fn1977, det løser desværre ikke mit problem.

buzzzz - tusinde tak for idéen - det hjalp mig i mål. Smid venligst et svar så jeg kan acceptere det som løsning.
http://pastebin.com/m38475a80

Performance-mæssigt kan det sikkert optimeres, men det må blive i en anden omgang.
Avatar billede fn1977 Nybegynder
24. september 2008 - 16:08 #4
Ja de kan jeg se det burde have været

SELECT top(1) groupID from grouporder
  where Created >= '2006-05-05'
  order by Created asc

Jeg trode du ville have det for en bestemt gruppe.. men du vil jo bare vide hvilken gruppe der er næste i rækkefølgen :)
Avatar billede sub_zero Nybegynder
24. september 2008 - 17:34 #5
Jeg vil netop have det for en bestemt gruppe.

Den bid jeg senest har posted på pastebin er en join i et omkringliggende query der hiver en helt masse data ud som er med til at bestemme hvilke grupper der er tale om.
Avatar billede Syska Mester
25. september 2008 - 08:28 #6
fn1977:
Det er netop ikke den næste inden for en bestemt dato span, men den som er tætest på en bestemt dato inden for en span, så den måde du gør det på vil ikke virke ...

sub_zero:
cool, jeg smider et svar ... hvad er query time for den da ?
Avatar billede sub_zero Nybegynder
25. september 2008 - 08:53 #7
lige pt. er det ikke muligt at måle i SQL Server Manageren fordi det går så hurtigt, men antallet af records vil vokse eksponentielt (dog altid ca. samme antal records pr. dag/gruppe).
Avatar billede Syska Mester
25. september 2008 - 11:04 #8
heheh okay :-)
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