Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Komplisert opptelling?

1 view
Skip to first unread message

"PÃl G. Larsson"

unread,
Aug 30, 2008, 9:59:46 AM8/30/08
to
Har en stor database som bl.a. inneholder feltene id og vare. Man kan
tenke seg det omtrent som i en butikk: en person kommer og kjøper en
eller flere varer. Det er banalt å sette opp antall varer en person
kjøper, men det jeg ønsker er fordelingen på antall forskjellige varer
kjøpt. Hvert record innholder bare en vare. F.eks med en base med slikt
innhold:

id vare
1 v5
2 v4
3 v4
2 v5
4 v2
4 v3
2 v4
2 v5
1 v5
2 v3
4 v4
4 v2
2 v5
3 v4

Her har
id 1 kjøpt 2 forskjellige varer
id 2 kjøpt 3 forskjellige varer (ved 6 anledninger)
id 3 kjøpt 1 vare
id 4 kjøpt 3 forskjellig varer (ved 4 anledninger)

Således har jeg 2 kunder (50% :-) ) som kjøper 3 varer og en med 2 varer
og en med en vare.

Jeg ønsker altså distribusjonen av antall distinkte varer per ID. Ikke
antall varer eller antall ganger id forekommer per vare e.l.

Da databasen inneholder mellom 5 og 6 millioner records, så det er ikke
håndtellejobb.

Det er ca 100 ulike varer, så jeg har lurt på å startet med vare én og
gå oppover, men med inntil ca 6 varer på maks blir det vel 100^6
kombinasjoner å beregne? Det er noen hundre tusen ID.

Finnes det noen smart løsning?

For ordens skyld, det dreier seg ikke om butikk (med hundretusener av
kunder), men synes analogien forenkler forklaringen.

Pål

Harald Nordgard-Hansen

unread,
Aug 30, 2008, 2:41:59 PM8/30/08
to
PÃl G. Larsson wrote:
> (...)

> Således har jeg 2 kunder (50% :-) ) som kjøper 3 varer og en med 2 varer
> og en med en vare.

Dataene er faktisk 2 kunder med 3 varer, og 2 kunder med 2 varer. :)

> Jeg ønsker altså distribusjonen av antall distinkte varer per ID. Ikke
> antall varer eller antall ganger id forekommer per vare e.l.

Det virker vel helt greitt med en liten:
select id, count(distinct(vare)) from handel group by id;

Det gir i alle fall forventet resultat i postgresql. :)

-Harald
--
Harald Nordgård-Hansen

"PÃl G. Larsson"

unread,
Aug 31, 2008, 4:24:57 AM8/31/08
to
Harald Nordgard-Hansen skrev:

> PÃl G. Larsson wrote:
>> (...)
>> Således har jeg 2 kunder (50% :-) ) som kjøper 3 varer og en med 2 varer
>> og en med en vare.
>
> Dataene er faktisk 2 kunder med 3 varer, og 2 kunder med 2 varer. :)
>
>> Jeg ønsker altså distribusjonen av antall distinkte varer per ID. Ikke
>> antall varer eller antall ganger id forekommer per vare e.l.
>
> Det virker vel helt greitt med en liten:
> select id, count(distinct(vare)) from handel group by id;

Det ser ut som det løste mye. Skal sjekke resultatene - fikk drøyt
144000 linjer i output. Nå står det bare igjen å gjøre
frekvensfordelingen (hvor mange med 1 vare osv).

Takk


Pål

Harald Nordgard-Hansen

unread,
Aug 31, 2008, 6:39:32 AM8/31/08
to
PÃl G. Larsson wrote:
> Harald Nordgard-Hansen skrev:

>> Det virker vel helt greitt med en liten:
>> select id, count(distinct(vare)) from handel group by id;
>
> Det ser ut som det løste mye. Skal sjekke resultatene - fikk drøyt
> 144000 linjer i output. Nå står det bare igjen å gjøre
> frekvensfordelingen (hvor mange med 1 vare osv).

Hmm. Nå slettet jeg tabellen, så jeg får ikke verifisert om det kommer
ut riktige data, men noe i retning av:
select numv,count(id)
from (select id, count(distinct(vare)) as numv
from handel group by id) AS freq
group by numv;
burde gjøre jobben.

-Harald
--
Harald Nordgård-Hansen

"PÃl G. Larsson"

unread,
Aug 31, 2008, 7:23:22 AM8/31/08
to
Harald Nordgard-Hansen skrev:

> PÃl G. Larsson wrote:
>> Harald Nordgard-Hansen skrev:
>>> Det virker vel helt greitt med en liten:
>>> select id, count(distinct(vare)) from handel group by id;
>> Det ser ut som det løste mye. Skal sjekke resultatene - fikk drøyt
>> 144000 linjer i output. Nå står det bare igjen å gjøre
>> frekvensfordelingen (hvor mange med 1 vare osv).
>
> Hmm. Nå slettet jeg tabellen, så jeg får ikke verifisert om det kommer
> ut riktige data, men noe i retning av:
select numv,count(pasientid)
from (select pasientid, count(distinct(atcnr)) as numv
from fdata group by pasientid) AS freq

group by numv;
> burde gjøre jobben.
>
> -Harald
Har kjørt programmet og output ser fornuftig ut. (Rett over 5 000 000
records beregnet på 28 s - synes det er bra på min gamle PC).

Takk for hjelpen så langt

Pål

0 new messages