Avatar billede -xyz- Nybegynder
12. april 2007 - 13:42 Der er 9 kommentarer og
1 løsning

Virkelig Tricky Query 1 til mange relation

Ja, jeg sidder med en tabel (t1) der har en en shared key mellem 3 kolonner (id, startdato og slutdato), og der kan sagtens være flere med samme id, sålænge resten er unikt.

nu er mit problem at jeg gerne vel hente alle unikke id ud, men med den seneste slutdato dvs. at jeg hanter alle unikke id ud og så får jeg automatisk den med den nyeste slutdato, men ikke de andre der måtte være på det id.

Get it?
Avatar billede -xyz- Nybegynder
12. april 2007 - 13:53 #1
Glemte forresten at den kun skal vælge dem hvor der er under en mdr. til slutdato.
Avatar billede -xyz- Nybegynder
12. april 2007 - 13:53 #2
dvs ikke alle id.
Avatar billede lorentsnv Nybegynder
12. april 2007 - 15:29 #3
Jeg er lidt usikker på om følgende går, men prøv. Det jeg er usikker på er group på en join, men jeg mener det skal kunne lade sig gøre.

Select t2.id, max(t1.startdato), t2.slutdato
from t1 inner join
  (Select id, max(slutdato) as Slutdato from t1 group by id) t2
    on t1.id = t2.id and t1.slutdato = t2.slutdato
group by t2.id, t2.slutdato
Avatar billede -xyz- Nybegynder
13. april 2007 - 08:56 #4
Jeg kunne ikke få den til at virke, jeg har kunnet få denne her til NÆSTEN at virke, bortset fra at den ikke lader mig sortere efter slutdato og så vællger hden heller ikke den nyeste.

SELECT DISTINCT Formidlingsaftaler.hid,formidlingsaftaler.Formidling_Start, formidlingsaftaler.Formidling_Slut, hHus.hadresse, hhus.hpostnr, postnr.bynavn, maeglere.maeglerinitialer
FROM        Formidlingsaftaler INNER JOIN SS_EmneEjerInfo ON Formidlingsaftaler.HID = SS_EmneEjerInfo.HusID INNER JOIN
                      Maeglere ON SS_EmneEjerInfo.Maegler = Maeglere.MaeglerID INNER JOIN
                      hHus ON SS_EmneEjerInfo.HusID = hHus.hID INNER JOIN
                      postnr ON hHus.hPostnr = postnr.Postnr WHERE    (formidlingsaftaler.Formidling_Slut > 1000000)  ORDER BY formidlingsaftaler.Formidling_Slut ASC

Håber du kan arbejde lidt videre med den, for jeg er virkelig lost

Kenneth
Avatar billede lorentsnv Nybegynder
13. april 2007 - 09:13 #5
Jeg går ud fra at det er i tabellen formidlingsaftale du gerne vil finde de rigtige records, inden du linker dig op til de øvrige tabelelr?

Kan der være flere identiske Formidling_Slut på samme hid, men med forskellige Formidling_Start. I så fald, hvilken skal vælges?

I din select sørger du vel ikke at få fat i unike hid, da du udelilukkende har en formidlingsaftaler.Formidling_Slut > 1000000 som kriterie
Avatar billede -xyz- Nybegynder
13. april 2007 - 09:27 #6
Jeg har fået den til at virke med denne query:

SELECT DISTINCT Formidlingsaftaler.hid,formidlingsaftaler.Formidling_Start, formidlingsaftaler.Formidling_Slut, hHus.hadresse, hhus.hpostnr, postnr.bynavn, maeglere.maeglerinitialer
FROM        Formidlingsaftaler INNER JOIN SS_EmneEjerInfo ON Formidlingsaftaler.HID = SS_EmneEjerInfo.HusID INNER JOIN
                      Maeglere ON SS_EmneEjerInfo.Maegler = Maeglere.MaeglerID INNER JOIN
                      hHus ON SS_EmneEjerInfo.HusID = hHus.hID INNER JOIN
                      postnr ON hHus.hPostnr = postnr.Postnr WHERE    (formidlingsaftaler.Formidling_Slut > 1000000) AND ((formidlingsaftaler.Formidling_Slut - 1176392640) < 2592000) AND (hHus.hStatus = 'Online') AND (formidlingsaftaler.Formidling_Slut - 1176392640 < 2592000)  AND (Maeglere.MaeglerID = 1)  AND formidlingsaftaler.indsat_dato = (SELECT MAX(indsat_dato) FROM formidlingsaftaler WHERE hid = Formidlingsaftaler.hid )  ORDER BY formidlingsaftaler.Formidling_Slut ASC

Læg et svar du har virkelig fortjent points
Avatar billede lorentsnv Nybegynder
13. april 2007 - 09:35 #7
God du har fået det til at virke! :-)

De tal du bruger til at checke Formidling_Slut (- 1176392640 og  2592000), hvor kommer de fra?
Avatar billede fennec Nybegynder
13. april 2007 - 09:42 #8
Ved ikke hvad der er bedst hastighedsmæssig, men det kan også laves på denne måde:

SELECT t1.*, (SELECT MAX(Dato) FROM tabel2 WHERE refID = t1.id) AS dato
FROM Tabel1 t1
WHERE ((SELECT MAX(Dato) FROM tabel2 WHERE refID = t1.id) > GETDATE() - 31)
Avatar billede -xyz- Nybegynder
13. april 2007 - 09:56 #9
tallene kommer fra den "programmør" der har siddet i min stilling før mig, han synes det var totalt smart at bruge unix timestamp i asp og SQL server i stedet for den indbyggede DateTime så derfor bliver jeg nød til at konvertere enhver dato til sek fra 1/1 1970 00:00:00
Avatar billede -xyz- Nybegynder
13. april 2007 - 09:57 #10
2592000 svarer til 30 dage i sek.
og 1176392640 var igår ved 15 tiden
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