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.
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'.
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