/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Kontrol af usammenhængende forløb
Fra : Tomas Christiansen


Dato : 23-01-05 21:55

Jeg har et problem, som kan koges ned til noget i retning af:

En tabel A indeholder en hulens masse poster som har et ID-felt I og et
tids-felt T.

I identificerer hvilken ting man har med at gøre og T identificerer
tidspunktet defineret som ÅÅÅÅUU (firecifret årstal og tocifret ugenummer).

Der er ca.12.000 mulige I-værdier og ca. 200 mulige T-værdier.

Mit problem er at finde alle de I-værdier for hvilke der gælder, at der
findes mindst 52 T-værdier (svarende til ét år) som kommer i umiddelbart
rækkefølge, dvs. uden "huller" imellem.

Der skal lige nævnes at jeg arbejde med en Oracle 9.2 database.

-------
Tomas


 
 
Troels Arvin (23-01-2005)
Kommentar
Fra : Troels Arvin


Dato : 23-01-05 22:05

On Sun, 23 Jan 2005 21:55:05 +0100, Tomas Christiansen wrote:

> Mit problem er at finde alle de I-værdier for hvilke der gælder, at der
> findes mindst 52 T-værdier (svarende til ét år) som kommer i umiddelbart
> rækkefølge, dvs. uden "huller" imellem.

Prøv at se, om følgende kan inspirere:
http://www.dbazine.com/celko1.html

--
Greetings from Troels Arvin, Copenhagen, Denmark


Tomas Christiansen (23-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 23-01-05 22:21

Troels Arvin skrev:
> Prøv at se, om følgende kan inspirere:
> http://www.dbazine.com/celko1.html

Hmmm - kan ikke lige se hvor du vil hen?

Eksempel:
For I=1 findes der poster med T=200101, 200102, 200103, 200104 og helt frem
til 200207. Det betyder at der for I=1 findes en periode med mindst 52
værdier af T som er i ét sammenhængende forløb.
Mangler f.eks. posten med T=200130, så er den være gal, idet der er et hul.
Perioden kan starte hvorsomhelst, men skal indeholde mindst 52
sammenhængende poster...

-------
Tomas


Troels Arvin (23-01-2005)
Kommentar
Fra : Troels Arvin


Dato : 23-01-05 22:48

On Sun, 23 Jan 2005 22:21:09 +0100, Tomas Christiansen wrote:

> For I=1 findes der poster med T=200101, 200102, 200103, 200104 og helt frem
> til 200207. Det betyder at der for I=1 findes en periode med mindst 52
> værdier af T som er i ét sammenhængende forløb.
> Mangler f.eks. posten med T=200130, så er den være gal, idet der er et hul.
> Perioden kan starte hvorsomhelst, men skal indeholde mindst 52
> sammenhængende poster...

OK. Jeg kan ikke lige se nogen måde hvorpå det kan gøres i ren SQL (dog
sikkert sagtens i PL/SQL). Jeg ville nok for hver I simpelthen select'e
alle T og så behandle dem proceduralt - hvilket sikkert indeholder lidt
fedteri med hensyn til at nogle år har flere uger end andre.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Tomas Christiansen (23-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 23-01-05 23:00

Troels Arvin skrev:
> OK. Jeg kan ikke lige se nogen måde hvorpå det kan gøres i ren SQL (dog
> sikkert sagtens i PL/SQL). Jeg ville nok for hver I simpelthen select'e
> alle T og så behandle dem proceduralt - hvilket sikkert indeholder lidt
> fedteri med hensyn til at nogle år har flere uger end andre.

Jeps. Jeg har netop for letheds skyld sagt at et år altid er 52 uger. Svaret
behøver ikke at være 100% præcist

Tænkte på om man kunne oprette en tabel X med alle de mulige år-uge værdier
og give dem fortløbende numre.
Derved burde man kunne foretage en søgning, hvor man checker på én bestemt
værdi i X og lader dennes år-uge være den nedre grænse, lægge 51 til
nummeret og lade denne posts år-uge være den øvre grænse. Nu kan man så
tælle alle de poster som ligger indenfor den nedre og øvre grænse, og findes
der en I som har præcis 52 poster indenfor denne periode, ja så må de alle
være der.

Det hjælper nogle gange at sætte sig ned og formulere et problem for andre -
så får man skåret det uvæsentlige væk og kommer ind til benet. Min problem
er naturligvis langt mere kompleks end jeg her har givet udtryk for og
kræver opslag og diverse andet i andre tabeller, men alt det andet _har_ jeg
styr på (indtil det modsatte er bevist...)

-------
Tomas


Troels Arvin (23-01-2005)
Kommentar
Fra : Troels Arvin


Dato : 23-01-05 23:30

On Sun, 23 Jan 2005 23:00:07 +0100, Tomas Christiansen wrote:
> Tænkte på om man kunne oprette en tabel X med alle de mulige år-uge værdier
> og give dem fortløbende numre.
> Derved burde man kunne foretage en søgning, hvor man checker på én bestemt
> værdi i X og lader dennes år-uge være den nedre grænse, lægge 51 til
> nummeret og lade denne posts år-uge være den øvre grænse. Nu kan man så
> tælle alle de poster som ligger indenfor den nedre og øvre grænse, og findes
> der en I som har præcis 52 poster indenfor denne periode, ja så må de alle
> være der.

Netop. Men der er så vidt jeg kan se et problem: Du kan vel ikke bare
starte med en given I's første T-værdi? Hvis den fejler din test kan der
jo sagtens være forløb senere, hvor der er 52 sammenhængende T'er?
Dermed er du vel i praksis nærmest nødt til at teste for alle
start-T-værdier indtil du finder en sammenhængende periode.

Anyways: Det med at generere en tabel med 52 rækker kunne måske også
gøres som en stored producedure, der tager en I-værdi som input og
genererer en mængde på 52 passende elementer. Sådanne elementer ville da
kunne bruges i en underførespørgsel i stil med

SELECT COUNT(SELECT 1 FROM bar WHERE I=i AND T IN (myproc(start-t)))

(På ingen måde testet.)

Jeg går stærkt ud fra, at man i Oracle kan skrive mængde-returnerende
funktioner, og at den måske endda har en funktion i stil med
dem på http://www.postgresql.org/docs/8.0/static/functions-srf.html

--
Greetings from Troels Arvin, Copenhagen, Denmark


Lars Hoffmann (24-01-2005)
Kommentar
Fra : Lars Hoffmann


Dato : 24-01-05 01:13

Tomas Christiansen wrote:


> Derved burde man kunne foretage en søgning, hvor man checker på én bestemt
> værdi i X og lader dennes år-uge være den nedre grænse, lægge 51 til
> nummeret og lade denne posts år-uge være den øvre grænse. Nu kan man så
> tælle alle de poster som ligger indenfor den nedre og øvre grænse, og findes
> der en I som har præcis 52 poster indenfor denne periode, ja så må de alle
> være der.

Dette vil kun virke hvis du kan være sikker på at hver år-uge aldrig gentages.
Med venlig hilsen
Lars Hoffmann

Tomas Christiansen (24-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 24-01-05 01:58

Lars Hoffmann skrev:
> Dette vil kun virke hvis du kan være sikker på at hver år-uge aldrig
gentages.

Naturligvis!
Det vil ikke gentage sig for samme I (det er sikret gennem nogle af de
øvrige betingelser jeg har i mit where-clause).

-------
Tomas


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste