Toon posts:

[SQL] selecteren van gecategoriseerde objecten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb een database van 50 gig en daar wil ik wat informatie uithalen. Ik heb alleen maar leesrecht. Bij andere opdrachten trek ik zo'n database naar mijn lokale pc, en haal er vervolgens uit wat ik nodig heb (voor statistische modelletjes), echter, nu trek ik liever geen 50 gig door een 10Mbit lijntje.

Normaal gesproken is mijn beperkte databasekennis geen probleem voor het verkrijgen van data, echter nu, na wat speurwerk met Google, ben ik er nog niet uit.

De database heeft de volgende simpele platte structuur:
code:
1
2
3
4
5
6
7
8
bedrijf maand product andere_vars
X 1 A ..   
X 1 B ..
X 2 A ..
X 2 B ..
Y 1 C 
Y 2 C
Y 3 C


Merk nogmaals op dat ik alleen leesrechten heb!

Ik wil producten A&B categoriseren als productgroep A* en product C als C*.
Vervolgens wil ik de volgende lijst:

code:
1
2
3
bedrijf product
X  A* ..   
Y C* ..



Ik wil dus een lijst met unieke bedrijf* product combinaties, waarbij de orginele producten zijn gegroepeerd in nieuwe productgroepen.


Even voor de beeldvorming: er zijn zo'n 1200 verschillende producten, over 6 maanden en een 1.000.000 bedrijven. Ik wil de 1200 producten terugbrengen tot 30 categorieen.

Iemand een idee? Waar moet ik op zoeken in Google?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waar hoort mijn topic?
*Schopt van DTE naar PRG*

En vervolgens:
Programming FAQ >> Programming FAQ - SQL >> Hoe werkt dat GROUP BY nu eigenlijk?

Ook een goede bron: http://www.w3schools.com/sql/default.asp en ander kun je altijd zoeken naar tutorials.

[ Voor 30% gewijzigd door RobIII op 02-12-2006 10:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Ik heb uiteraard gekeken naar group by, maar ik zie niet hoe ik binnen group by kan categoriseren :)

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Dan zal ik als ik jou was nog een keer kijken. Misschien ook naar distinct; want ik ben er nog niet helemaal uit wat je nou precies wilt.

Verwijderd

Topicstarter
Wat ik wil is heel simpel:

Ik heb producten A,B,C,D
Ik wil die producten in nieuwe categorieen indelen: A* en B*
Bv
A->A*
B->A*
C->C*
D->C*

en vervolgens wil ik een group by doen met die nieuwe productcodes A* en C*
Echter, dit moet in een select statement, want ik kan geen nieuwe kolommen aanmaken in de tabel.

Helder?

[ Voor 4% gewijzigd door Verwijderd op 02-12-2006 11:35 ]


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Maar waar wil je nou op categoriseren? Of pak je random letters die andere letters moeten worden? Ik snap de relatie niet, ook niet met de eerste tabel in je startpost..

  • attiks
  • Registratie: Augustus 2006
  • Laatst online: 20-12-2021
Verwijderd schreef op zaterdag 02 december 2006 @ 11:34:
Wat ik wil is heel simpel:

Ik heb producten A,B,C,D
Ik wil die producten in nieuwe categorieen indelen: A* en B*
Bv
A->A*
B->A*
C->C*
D->C*

en vervolgens wil ik een group by doen met die nieuwe productcodes A* en C*
Echter, dit moet in een select statement, want ik kan geen nieuwe kolommen aanmaken in de tabel.

Helder?
Misschien eerst een gewone group by doen op de bestaande producten en vervolgens deze data in een lokale tabel steken.

Vervolgens een tweede lokale tabel gebruiken om de indeling op te slaan en deze dan als basis gebruiken voor de nieuwe group by

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

attiks schreef op zaterdag 02 december 2006 @ 12:24:
[...]


Misschien eerst een gewone group by doen op de bestaande producten en vervolgens deze data in een lokale tabel steken.

Vervolgens een tweede lokale tabel gebruiken om de indeling op te slaan en deze dan als basis gebruiken voor de nieuwe group by
Of een case when in je select.

  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
Zonder schrijfrechten wordt dit moeilijk, maar met een custom aggregate en de subset operator zou dit makkelijk moeten kunnen.

Het wordt dan iets van:

SQL:
1
2
3
4
5
6
select
    bedrijf, array_accum(product) as producten
from
    tabel
group by
     bedrijf


Dit zal een tabel opleveren van:

code:
1
2
3
bedrijf producten   
X        {B, A, B}
Y        {C, C, C}


Vervolgens kijk je of A,B en C,D een subset zijn van producten.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select
    bedrijf, 
    case when '{A,B}' <@ producten then
       "A*"
     else
        "andere case"
     end as category

from (
   select
       bedrijf, array_accum(product) as producten
   from
       tabel
   group by
       bedrijf
) as ruwe_producten


Dit zo even uit het losse polsje, maar het zou moeten werken. Wij doen namelijk *exact* hetzelfde als wat jij hier wilt doen en dat werkt perfect met deze constructie. ;)

Echt relationeel gezien zouden de puristen voor zoiets een beetje hun neus ophalen trouwens, omdat je eigenlijk wat meer procedurele code mengt met relationele, maar voor de gemiddelde mensch zal dat boeie wezen.

edit:

Hmmm, volgens mij las ik je probleem verkeerd en wil je het precies andersom. Je voorbeeld in de startpost is was ongelukkig gekozen, want je wilt in je resultaat meerdere keer het zelfde bedrijf hebben, voor elke produkt category die zij hebben en alleen een A kan dus al een A* zijn, (dus A* hoeft niet perse A EN B te zijn)?

In dat geval wordt het mischien nog wel makkelijker:
'rename' in je sub-query alle producten naar je category namen. Dat kan gewoon 1 op 1 en heb je geen subsets voor nodig. Group hierop en op bedrijf in je hoofdquery en je bent klaar.

[ Voor 20% gewijzigd door flowerp op 03-12-2006 10:12 ]

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Verwijderd

Topicstarter
Opgelost, de tip van GX was precies wat ik moest hebben :)

Ik had al gezocht op Google, maar als je geen goed aanknopingspunt hebt, dan is het lastig. Ik zocht bv op 'sql categorise', 'sql aggregate character functions'

Na even de syntax van 'case when' te hebben bekeken kwam ik op de volgende werkende (en zeer simpele) scriptje querietje:


SELECT bedrijf,
CASE
WHEN prod = 'a' THEN 'A*'
WHEN prod = 'b' THEN 'A*'
WHEN prod = 'c' THEN 'C*'
WHEN prod = 'd' THEN 'C*'
END
AS pro,
FROM test
GROUP BY hv, pro


Dank allemaal voor het meedenken _/-\o_

  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
Verwijderd schreef op zondag 03 december 2006 @ 18:17:
Na even de syntax van 'case when' te hebben bekeken kwam ik op de volgende werkende (en zeer simpele) scriptje:
Even mierenneuken maar een (sql) query noem je geen scriptje ;)

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.

Pagina: 1