Avatar billede hrc Mester
15. oktober 2007 - 13:04 Der er 12 kommentarer og
1 løsning

Finde id til fundne mindste dato

Mangler en mere elegant / sikker løsning som gør nedenstående:

  select id, dato from test where dato = (select min(dato) from test)

Ulemperne ved ovenstående er:
  - Det er en subselect
  - Jeg spørger på en datetime type
Avatar billede kalp Novice
15. oktober 2007 - 13:09 #1
select id, dato, MIN(dato) as minimum from test where dato = minimum

måske sådan.
Avatar billede kalp Novice
15. oktober 2007 - 13:12 #2
select id, dato from test where dato = min(dato)
Avatar billede pidgeot Nybegynder
15. oktober 2007 - 13:12 #3
SELECT TOP 1 id, dato FROM test ORDER BY dato ASC var en mulighed der undgår en subselect.

Hvorfor mener du i øvrigt det nødvendigvis er en ulempe at spørge på en datetime? Det er jo i bund og grund blot et tal internt, ikke en string.
Avatar billede kalp Novice
15. oktober 2007 - 13:14 #4
se bort fra min første kommentar.. nr. 2 burde tilgengæld virke:)
Avatar billede hrc Mester
15. oktober 2007 - 13:30 #5
Ja, "top" burde virke. Har været lidt afholdende overfor denne. I værste tilfælde kan man tænke sig serveren udvælger alle records fra tabellen for at returnere den første. Må håbe der er et par optimeringer undervejs.

Smid et svar pidgeot; det er bedre end oplægget. Underligt at man skal bruge en platformspecifik funktion for at løse en ellers ret almindelig opgave.
Avatar billede hrc Mester
15. oktober 2007 - 13:33 #6
kalp: Jeg vil helst undgå at forespørge på et datetime-felt. Sådanne tingester er tit noget med decimaler, hvor man ude i 17 decimal fejler på sammenligningen mellem to ellers ens datoer.

Har flere dårlige oplevelser med sammenligninger på decimaler.
Avatar billede kalp Novice
15. oktober 2007 - 13:36 #7
hrc >> jeg kan ikke se hvornår den kan fejle når den arbejder med egen data og ikke udefra kommende parametre.. først der ville det have været et problem:)
Avatar billede hrc Mester
15. oktober 2007 - 13:50 #8
kalp: Det er korrekt der umiddelbart ingen problemer er med dit eksempel. Bagved kan jeg ikke se hvordan MS-SQL undgår en subselect - og så er man ovre i mit oplæg. Jeg efterlyste en løsning som ikke lavede subselects og spurgte på datetime-felter.
Avatar billede neoman Novice
15. oktober 2007 - 13:52 #9
Decimal-delen  af DateTime kan barberes væk vha noget CAST + FLOOR, således at man direkte kan finde den pure Date-del gemt i DateTime, uden string conversions (format() osv):

http://www.eksperten.dk/spm/778549
Avatar billede hrc Mester
15. oktober 2007 - 14:05 #10
neoman: Jeg ved det - det er al den slags komplikationer jeg gerne vil undgå at skulle tænke på.
Avatar billede kalp Novice
15. oktober 2007 - 14:09 #11
hvis du er bange for at decimaler eller hvad du siger så gør sådan her..

select id, dato from test where DATEDIFF(dd,dato,min(dato)) = 0

så kan den da umuligt fejle.

Jeg tror - men er ikke sikker - at den er hurtigere end at lave en select top og order by.
Avatar billede pidgeot Nybegynder
15. oktober 2007 - 14:10 #12
Jf. dokumentationen er en DateTime nu reelt et 64-bit integer, så der er ingen decimaldel at være bekymret for (det bør der så heller ikke være alligevel - ja, floating-point er unøjagtigt, men så længe beregningstrinnene er de samme, får man samme resultat på samme computer):

http://msdn2.microsoft.com/en-us/library/aa258277(SQL.80).aspx

...og i og med at du enten skal have et index på det felt, eller leve med en table scan, så tvivler jeg også meget stærkt på at det gør nogen forskel rent performance-mæssigt - den bør kunne finde ud af at slå den første værdi i indexet op til subselecten (og MIN() for sig selv for den sags skyld).

Eneste umiddelbare fordel der er ved min er at du hurtigt kan ændre den hvis du vil til at have de 10 første ID'er samt deres dato, sorteret efter dato-feltet.
Avatar billede hrc Mester
15. oktober 2007 - 15:44 #13
Tak for biddragene alle sammen. Det er ellers blevet en interessant diskussion, men jeg bliver nødt til at afslutte den nu.

pidgeot: Godt de bruger heltal (de rykker vel bare decimaltallet n gange så det der tidligere var decimaltal nu bare er de mindste i et heltal.
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