Avatar billede ae03 Novice
10. juli 2012 - 10:03 Der er 1 kommentar og
1 løsning

Udtræk fra database med håbløs struktur

Jeg har en database, der er temmeligt håbløst struktureret, hvor jeg ikke kan få de relevante data - og kun de relevante data - samlet i en tabel, som er til at arbejde med.

Jeg har to tabeller (Hojde og Vaegt) med cpr, dato og tid (ikke samme felt som dato), hvoraf den ene rummer personhøjde h og den anden personvægt v.

Jeg skal have overfrt cpr, dato, tid samt samhørende værdier (samme registreringsdato og -tid) af h og v for den sidste registrering på den tidligste registreringsdato til tabellen Samlet. Dvs. h og v for min(dato) og på denne dato max(tid).

Det hele er i server 2005, så dato og tid har begge formatet datetime.
Avatar billede ae03 Novice
10. juli 2012 - 10:33 #1
Jeg skal lige huske at tilføje, at de registreringer, som skal ind i tabellen Samlet, skal tjekkes for, om der er valide registreringer af h og v. En del af de ekstra registreringer skyldes, at der ved fejlregistrering (fx ombytning af h og v) er blevet foretaget en ny frem for at rette den tidligere registrering. Derfor skal følgende være opfyldt: 'h>50' og 'v is not null'.
Avatar billede ae03 Novice
10. juli 2012 - 12:26 #2
Jeg har selv løst det. Nedenstående udtrækker relevant cpr, dato og tid, som var den problematiske del. Herefter skal det bare sammenkædes med højde og vægt.


create table #reg_temp
(
cpr nvarchar(255) not null,
dato datetime not null,
tid datetime not null
)

insert into #reg_temp (cpr, dato, tid)
(
select ra.cpr, ra.dato, ra.tid
from
(
select hb.personnummer as cpr, hb.dato as dato, hb.tid as tid
from
(
select ha.personnummer, ha.dato, ha.tid
from height as ha
where h2>50
) hb
inner join
(
select va.personnummer, va.dato, va.tid
from weight as va
where v2 is not null
) vb
on hb.personnummer = vb.personnummer and
hb.dato = vb.dato and b.tid = vb.tid
) ra
right join
(
select rb.cpr as cpr, min(rb.dato) as dato
from
(
select hb.personnummer as cpr, hb.dato as Dato, hb.tid as tid
from
(
select ha.personnummer, ha.dato, ha.tid
from height as ha
where h2>50
) hb
inner join
(
select va.personnummer, va.dato, va.tid
from wight as va
where v2 is not null
) vb
on hb.personnummer = vb.personnummer and
hb.dato = vb.dato and
hb.tid = vb.tid
) rb
group by rb.cpr
) r
on ra.cpr = r.cpr and
ra.dato = r.Dato
)

   
create table #reg_temp2
(
cpr nvarchar(255) not null,
dato datetime not null,
tid datetime not null
)

insert into #reg_temp2 (cpr, dato, tid)
(
select ra.cpr, ra.dato, ra.tid
from
(
select cpr, dato, tid
from #reg_temp
) ra
right join
(
select cpr as cpr, max(tid) as tid
from #reg_temp
group by cpr
) rb
on ra.cpr = rb.cpr and
ra.tid = rb.tid
)

drop table #reg_temp
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