pmnielsen Novice
30. januar 2018 - 12:06 Der er 11 kommentarer og
1 løsning

Udtræk fra database.

Har en vagt database, forenkelet se den sådan ud.
Person,dato,rettet.
1,2018-04-04,2018-01-01
2,2018-04-05,2018-01-01
3,2018-04-06,2018-01-01
2,2018-04-04,2018-03-03

i sidste linje har person nummer 2 overtaget en vagt den 2018-04-04, for at gemme historikken er den oprette som en ny række hvor rettet tabellen er nyere en den oprindelige vagt.

Nu vil jeg gerne have en udtræk over alle de dage i 2018 hvor person nummer 1 har vagt.

SELECT * FROM 'vagt' WHERE 'dato' <= '2018-01-01' AND 'person' = 1
Denne SELECT medtager selvfølgeligt også den 2018-04-04 hvor han ikke længere har vagt.
Hvordan får jeg skrevet min SELECT så det kun tager de datoer med, hvor rettet tabellen er den nyest dato.
Slater Ekspert
30. januar 2018 - 13:00 #1
Du kan ikke bare sige "...AND rettet > dato" ?
pmnielsen Novice
30. januar 2018 - 13:27 #2
Det går ikke. Rettet vil altid være mindre en dato, da vagten bliver bytte før den dag man har vagten.
Slater Ekspert
30. januar 2018 - 13:32 #3
Så er jeg ikke helt med.

Kan du forklare nærmere hvad "så det kun tager de datoer med, hvor rettet tabellen er den nyest dato" betyder? Jeg har vist ikke helt forstået datastrukturen.

Vil du have dem ud hvor rettet er lig med den højeste rettet-dato i tabellen? Eller den ene række fra en bruger hvor rettet er højst? Eller noget helt andet?
Rune1983 Guru
30. januar 2018 - 13:47 #4
Skal tabellen forståes sådan her?
Person, Vagtdato, Registrering
1, 2018-04-04, 2018-01-01
2, 2018-04-05, 2018-01-01
3, 2018-04-06, 2018-01-01
2, 2018-04-04, 2018-03-03
pmnielsen Novice
30. januar 2018 - 13:51 #5
Ja, dem hvor rettet er lig med den højeste rettet-dato.

id,person,dato,rettet.
1,1,2018-04-04,2018-01-01
2,2,2018-04-05,2018-01-01
3,3,2018-04-06,2018-01-01
4,2,2018-04-04,2018-03-03
5,1,2018-04-07,2018-01-01

så når jeg søger efter person 1 i overståene tabel vil få.
id 5 (id nummer 1 skal ikke vises da id 4 har en nye dato i rettet)

Håber det giver lidt mening :-/
pmnielsen Novice
30. januar 2018 - 13:56 #6
@Rune1983

ja, så person nummer 2 har overtaget vagten den 2018-04-04 og ændringen er lavet den 2018-03-03. Så det er den nyeste rettelse/registrering der gælder.
Rune1983 Guru
30. januar 2018 - 14:12 #7
Prøv følgende
SELECT MAX(rettet) FROM vagt
WHERE person = 1
AND DATE_FORMAT(dato, "%Y") = 2018
GROUP BY rettet
Slater Ekspert
30. januar 2018 - 14:25 #8
Altså, du kan gøre det via en subquery, f.eks.

SELECT * FROM vagt WHERE person = 1 AND rettet = (
    SELECT MAX(rettet) FROM test WHERE person = 1
)

Men du vil jo støde ind i problemer, hvis personen har rettet flere forskellige vagter til forskellige tider, da du kun får dem med den højeste tid. Umiddelbart virker det som om tabellen kunne designes bedre.
Slater Ekspert
30. januar 2018 - 14:28 #9
#7: Hvad skulle det gøre? Den henter jo kun tidspunktet, ikke de andre data, og så er den hardcodet til kun at acceptere vagter fra 2018? Hvorfor?
acore Ekspert
30. januar 2018 - 16:08 #10
Prøv

SELECT v.id,v.person,v.dato,v.rettet
FROM
(
  SELECT dato,max(rettet) AS maxrettet
  FROM vagt
  GROUP BY dato
) AS x
LEFT JOIN vagt AS v ON x.dato = v.dato AND x.maxrettet = v.rettet
WHERE person = 1 AND DATE_FORMAT(v.dato, "%Y") = 2018;
pmnielsen Novice
30. januar 2018 - 20:15 #11
@acore.
Det ser ud til at løse alle livet problemer. godt gået.
Jeg kigger lige på den 2 gange mere i håb om jeg helt forstår hvad der sker :-)

Mange tak for hjælpen alle sammen.
acore Ekspert
30. januar 2018 - 21:43 #12
Det er en såkaldt "self-join" - se https://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/, hvor de forklarer princippet: 1) find de største rettedatoer for hver dato, efterfulgt af 2) vælg resten af data fra rækken med en JOIn (LEFT eller INNER).

I linket er der også forklaret andre måder at opnå det samme på.
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

Opret Preview

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





Premium
ERP-virksomhed har indført ubegrænset ferie for alle medarbejdere - og resultatet er en succes: "Medarbejderne knokler og har et smil på læben"
ERP-virksomheden Unit4 har indført ubegrænset betalt ferie for samtlige medarbejdere verden over, hvor man som ansat nu selv kan bestemme. "Som direktør har jeg det rigtig godt med det", siger dansk landechef Anders Holm Jørgensen. Ifølge ham kan medarbejderne sagtens administrere ordningen.
Computerworld
Stein Bagger gør comeback i ny branche: "De lignede et mafiahold, førte sig frem som nyrige og plaprede løs om urealistiske drømme"
Stein Bagger har skiftet navn og fører sig nu frem i store biler i en helt ny branche, skriver en dansk avis.
CIO
Podcast: Her er seks gode råd om ledelse og digitalisering fra danske top-CIO'er
The Digital Edge: Vi har talt med 17 af Danmarks dygtigste digitale ledere - og samlet deres seks bedste råd om digitalisering og ledelse. Få alle rådene på 26 minutter i denne episode af podcasten The Digital Edge.
Job & Karriere
Se Waoos forklaring: Derfor har selskabet fyret topchef Jørgen Stensgaard med omgående virkning
Waaos bestyrelse opsiger fiberselskabets topchef, Jørgen Stensgaard, der fratræder med omgående virkning. Se hele forklaringen fra Waao her.
White paper
Sådan sælger du nemt IT-sikkerhed og backup som en service – og styrker din indtjening
Den klassiske forhandlermodel med salg af produkter er under pres. Som IT-forhandler er du enormt konkurrenceudsat og de kunder der køber, er ikke altid loyale. Den hårde konkurrence giver samtidig stærkt begrænsede margener. For kunden er det er mere besværligt købe produkter end det er at købe services og du risikerer derfor, at kunden smutter over til en nemmere og mere fleksibel løsning - det vil sige til nogen, der sælger services. Nøglen til vækst er ofte at påtage sig rollen som managed service provider. Her tilbyder du en pakke af services, der komplementerer primærproduktet og løser en udfordring for kunden – og styrker dit salg og din indtjening. Du opnår en løbende indtægt, en tættere relation til dine kunder og en fleksibilitet og skalerbarhed, som kun skyen kan tilbyde. Et oplagt eksempel er en kombination af salg af services som cyberbeskyttelse og backup. I denne hvidbog får du konkrete råd til, hvordan du kommer i gang med at optimere din forretningsmodel.