|
| Udfordring: SQL select query Fra : ///JJ |
Dato : 14-04-04 22:17 |
|
Jeg sidder fast med et problem.
I en given tabel findes en række data:
Serie Nummer
1 1
1 2
1 3
1 osv....
1 24
1 25
Der er her i ekspemplet 25 rækker.
Opgaven går ud på at skrive et select statement der kan finde evt. manglende
numnre, fx. hvis nr. 5 ikke var med, så skulle resultatet være:
Manglende numre:
5
Der vil altid være maks 25 rækker i en serie, men der kan mangle ligeså
mange.
Jeg mangler nogle angrebsvinkler...... skal jeg igennem noget for-løkke
eller hvad?
Mvh
///JJ
| |
///JJ (14-04-2004)
| Kommentar Fra : ///JJ |
Dato : 14-04-04 22:22 |
|
///JJ wrote:
> Jeg sidder fast med et problem.
Glemte at nævne at det er MS SQL 7.
///JJ
| |
Henrik Stidsen (14-04-2004)
| Kommentar Fra : Henrik Stidsen |
Dato : 14-04-04 22:44 |
|
"///JJ" <nospam@tdcadsl.dk> wrote in
news:407daa73$0$201$edfadb0f@dread16.news.tele.dk
> Jeg mangler nogle angrebsvinkler...... skal jeg igennem noget
> for-løkke eller hvad?
Jeg vil nok vælge at lave en select * og så i det program der laver
udtrækket løbe dem igennem med en for lykke og notere alle dem der
mangler. Et godt trick er så at tælle hvor mange man får ud, hvis man
får 25 rækker ud så kan man jo konkludere at der ikke mangler nogen
og så sparer man gennemløbet - forudsat at der ikke kan være
dubletter.
Jeg tror ikke det kan gøres på andre måder.
--
..: Henrik Stidsen - http://hs235.dk/blog/ ::...
'Veni, Vidi, Velcro' - I came, I saw, I stuck around.
| |
Jens Gyldenkærne Cla~ (14-04-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 14-04-04 22:50 |
|
Henrik Stidsen skrev:
> Jeg tror ikke det kan gøres på andre måder.
Jo - hvis man laver en referencetabel med alle numre fra 1 til max-
værdien i serien. Så kan man finde hullerne med følgende join
SELECT r.id
FROM referencetabel r
LEFT JOIN serietabel t
ON r.id = t.id
WHERE t.id IS NULL
--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information
| |
Henrik Stidsen (14-04-2004)
| Kommentar Fra : Henrik Stidsen |
Dato : 14-04-04 23:20 |
|
Jens Gyldenkærne Clausen <jens@gyros.invalid> wrote in
news:Xns94CBF26FDE064jcdmfdk@gyrosmod.cybercity.dk
>> Jeg tror ikke det kan gøres på andre måder.
>
> Jo - hvis man laver en referencetabel med alle numre fra 1 til max-
> værdien i serien. Så kan man finde hullerne med følgende join
Tænkte godt nok på om ikke man kunne bruge noget med IS NOT NULL men
havde helt glemt den mulighed du nævner.
--
..: Henrik Stidsen - http://hs235.dk/blog/ ::...
'Veni, Vidi, Velcro' - I came, I saw, I stuck around.
| |
Kristian Damm Jensen (15-04-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 15-04-04 07:30 |
|
///JJ wrote:
> Jeg sidder fast med et problem.
>
> I en given tabel findes en række data:
>
>
> Serie Nummer
> 1 1
> 1 2
> 1 3
> 1 osv....
> 1 24
> 1 25
>
> Der er her i ekspemplet 25 rækker.
> Opgaven går ud på at skrive et select statement der kan finde evt.
> manglende numnre,
(a) Find slutpunktet for et hul
Altså: finde numre, hvor der findes tidligere numre, men hvor den
umiddelbart forrige ikke findes.
select * from T t1
where exists (select * from T t2 where t2.nummer < t1.nummer)
and not exists(select * from T t3 where t3.nummer +1 = t1.nummer)
(b) Find startpunktet for et hul
select * from T t4
where exists (select * from T t5 where t5.nummer > t4.nummer)
and not exists(select * from T t6 where t6.nummer +1 = t4.nummer)
(c) Kombiner de to
select t4.nummer+1 start
, t1.nummer-1 slut
from T t1, T t4
where exists (select * from T t2 where t2.nummer < t1.nummer)
and not exists(select * from T t3 where t3.nummer +1 = t1.nummer)
and exists (select * from T t5 where t5.nummer > t4.nummer)
and not exists(select * from T t6 where t6.nummer +1 = t4.nummer)
(c) har nu den ulempe, at hvis der findes flere intervaller med huller, vil
alle kombinationer af start og slut blivce vist, altså fx
Serien 1 6 10 giver
2, 5
2, 9
7, 5
7, 9
(d) Fjern kombinationer, hvor der findes noget mellem start og slut
select t4.nummer+1 start
, t1.nummer-1 slut
from T t1, T t4
where exists (select * from T t2 where t2.nummer < t1.nummer)
and not exists(select * from T t3 where t3.nummer +1 = t1.nummer)
and exists (select * from T t5 where t5.nummer > t4.nummer)
and not exists(select * from T t6 where t6.nummer +1 = t4.nummer)
and not exists
(select * from T t7
where t7.nummer between t4.nummer and t1.nummer)
> fx. hvis nr. 5 ikke var med, så skulle resultatet
> være:
>
> Manglende numre:
> 5
Ikke helt hvad du ønskede, men du kan muligvis bruge det alligevel.
--
Kristian Damm Jensen damm (at) ofir (dot) dk
Reality is that which, when you stop believing in it, doesn't go away.
-- Philip K. Dick
| |
|
|