Avatar billede 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.
Avatar billede Slater Ekspert
30. januar 2018 - 13:00 #1
Du kan ikke bare sige "...AND rettet > dato" ?
Avatar billede 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.
Avatar billede 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?
Avatar billede Rune1983 Ekspert
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
Avatar billede 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 :-/
Avatar billede 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.
Avatar billede Rune1983 Ekspert
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
Avatar billede 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.
Avatar billede 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?
Avatar billede 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;
Avatar billede 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.
Avatar billede 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å.
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

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