Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MSSQL] Vergelijken van meerdere rows

Pagina: 1
Acties:

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Beste Tweakers,

Ben al enige tijd bezig met dit vraagstuk en veelvuldig Googlen levert me steeds weer een andere methode op die niet naar tevredenheid werkt. Ik heb 40.000 rows die elk een label hebben, een unieke ID en groep ID. Als ik selecteer op group ID krijg ik dus de records terug die bij elkaar horen met verschillende labels.

Wat ik probeer te bereiken: om zo'n een groupje rows te vergelijken met de andere groepjes rows en te kijken hoevaak zo'n combinatie van labels voorkomt. Ik zit te denken aan een array die ik tegen elke rij vergelijk maar dit is niet zo eenvoudig in SQL. Ik moet dus meerdere kolommen vergelijken met andere rijen. Iemand een idee?

  • magiel
  • Registratie: Januari 2005
  • Laatst online: 19:27
Je kunt in je query twee keer dezelfde tabel selecteren. Kun je daar wat mee?

code:
1
2
3
4
..
FROM tabelX AS X1, tabelX AS X2
WHERE X1.label = X2.label
..

[ Voor 4% gewijzigd door magiel op 08-05-2012 13:17 ]

Ik wil het er _niet_ over hebben.


  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Bedankt voor je antwoord, ik denk niet dat dat is waar ik naar zoek omdat je dan alsnog rijen terugkrijgt. Ik wil bijvoorbeeld 4 rijen met dezelfde GROUP ID en met verschillende beschrijvingen vergelijken met andere records die dezelfde GROUP ID hebben om te kijken hoevaak die combinatie van beschrijvingen voorkomt

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

Xanthium schreef op dinsdag 08 mei 2012 @ 13:19:
Bedankt voor je antwoord, ik denk niet dat dat is waar ik naar zoek omdat je dan alsnog rijen terugkrijgt. Ik wil bijvoorbeeld 4 rijen met dezelfde GROUP ID en met verschillende beschrijvingen vergelijken met andere records die dezelfde GROUP ID hebben om te kijken hoevaak die combinatie van beschrijvingen voorkomt
Welke combinatie van beschrijvingen heb je het nu over?

Kun je een simpel voorbeeldje geven met data?

Het klinkt alsof you er wel kunt komen met een join op dezelfdde table, tenzij je iets bedoelt wat je hier niet zegt ;)

edit:
na nog een keer lezen denk ik dat "dezelfde GroupID" twee keer op een andere group ID slaat...

Heb je altijd hetzelfde aantal labels per GroupID? Ik zit te denken of je ze per groupID kunt concatten en vergelijken...

[ Voor 15% gewijzigd door Dido op 08-05-2012 13:35 ]

Wat betekent mijn avatar?


  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Dido schreef op dinsdag 08 mei 2012 @ 13:26:
[...]

Welke combinatie van beschrijvingen heb je het nu over?

Kun je een simpel voorbeeldje geven met data?

Het klinkt alsof you er wel kunt komen met een join op dezelfdde table, tenzij je iets bedoelt wat je hier niet zegt ;)

edit:
na nog een keer lezen denk ik dat "dezelfde GroupID" twee keer op een andere group ID slaat...

Heb je altijd hetzelfde aantal labels per GroupID? Ik zit te denken of je ze per groupID kunt concatten en vergelijken...
Sorry voor de wazigheid ;) voorbeeld:

ID GROUPID Label
1 1 Bla
2 1 Iets
3 1 Nog
4 2 Nog
5 2 Een
6 2 Test
7 3 Dit
8 3 Is
9 3 Nog
10 3 Een
11 3 Voorbeeld
12 4 Een
13 4 Test
14 4 Nog

Hier een sterk vereenvoudigd voorbeeld van de situatie. Ik wil graag weten per GROUPID welke combinaties er hoevaak voorkomen. De volgorde van de labels is niet relevant. Groep 2 en groep 4 zijn dus beiden gelijk en ik zou dit dus als '2' terug willen zien en de andere groepen als '1' omdat deze dus maar één keer voorkomen. Dit probeer ik te bereiken met een query

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

mmm, dat lijkt me knap lastig met 1 enkele query, zeker omdat de volgorde ongedefinieerd is.

Eigelijk will je dus weten welke "groepen" niet uniek zijn.

Wat betekent mijn avatar?


  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Dido schreef op dinsdag 08 mei 2012 @ 13:45:
mmm, dat lijkt me knap lastig met 1 enkele query, zeker omdat de volgorde ongedefinieerd is.

Eigelijk will je dus weten welke "groepen" niet uniek zijn.
Niet alleen de volgorde is ongedefinieerd, ook het aantal rows met dezelfde GROUP ID varieert contstant.. Ik wil weten hoevaak zo'n groep met die combinatie labels voorkomt.. lastig!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

Eens kijken... als je per groupID/label combinatie groepeert op een count(label) as c1
dan kun je daarna weer groeperen op groupID having average(c1) >= 2

Niet failsafe, maar het geeft een idee :(

Wat betekent mijn avatar?


  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Dido schreef op dinsdag 08 mei 2012 @ 13:49:
Eens kijken... als je per groupID/label combinatie groepeert op een count(label) as c1
dan kun je daarna weer groeperen op groupID having average(c1) >= 2

Niet failsafe, maar het geeft een idee :(
Ik denk niet dat ik daarmee het gewenste resultaat bereik, omdat je dan alleen kijkt naar het aantal labels binnen een groep. Ik zit toch te kijken of ik op een of andere manier de data van alle rows met dezelfde GROUP ID in 1 array kan gooien en deze steeds kan comparen tegen de andere groepen die dan ook in arrays worden gezet

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Als je nu alle unieke combinaties groepeert naar een uniek label en daarop telt, is dat wat je nodig hebt?

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE #TEST (id int identity(1,1), groupid int, label varchar(10))

INSERT INTO #TEST ( groupid, label) values ( 1, 'label a')
INSERT INTO #TEST ( groupid, label) values ( 1, 'label b')
INSERT INTO #TEST ( groupid, label) values ( 1, 'label c')
INSERT INTO #TEST ( groupid, label) values ( 2, 'label a')
INSERT INTO #TEST ( groupid, label) values ( 2, 'label b')
INSERT INTO #TEST ( groupid, label) values ( 3, 'label a')
INSERT INTO #TEST ( groupid, label) values ( 3, 'label b')
INSERT INTO #TEST ( groupid, label) values ( 3, 'label c')
INSERT INTO #TEST ( groupid, label) values ( 4, 'label a')
INSERT INTO #TEST ( groupid, label) values ( 4, 'label b')
INSERT INTO #TEST ( groupid, label) values ( 4, 'label d')



SELECT LabelString, COUNT(*) as Aantal 
FROM (

SELECT groupid, STUFF((SELECT ',' + label FROM #test WHERE groupid = t.groupid ORDER BY 1 ASC FOR XML PATH('')),1, 1, '') AS LabelString
FROM #test t
GROUP BY GroupId 
)A
GROUP BY LabelString


Dit geeft
label a,label b	1
label a,label b,label c	2
label a,label b,label d	1

Simpel voorbeeldje, maar wellicht is dit waar je naar op zoek bent? Alle labels binnen een groep worden achter elkaar geplakt, en daar doe je een count op icm group by

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
Is het niet zo simpel als:

code:
1
select count(id),groupid,label from tabel group by groupid,label order by count(id) desc;


nevermind, beter lezen.
Misschien iets concreter zijn in je voorbeeld, vooral het waarom is lekker onduidelijk nu.

[ Voor 31% gewijzigd door Mental op 08-05-2012 14:16 ]


  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
P_de_B schreef op dinsdag 08 mei 2012 @ 14:09:
Als je nu alle unieke combinaties groepeert naar een uniek label en daarop telt, is dat wat je nodig hebt?

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE #TEST (id int identity(1,1), groupid int, label varchar(10))

INSERT INTO #TEST ( groupid, label) values ( 1, 'label a')
INSERT INTO #TEST ( groupid, label) values ( 1, 'label b')
INSERT INTO #TEST ( groupid, label) values ( 1, 'label c')
INSERT INTO #TEST ( groupid, label) values ( 2, 'label a')
INSERT INTO #TEST ( groupid, label) values ( 2, 'label b')
INSERT INTO #TEST ( groupid, label) values ( 3, 'label a')
INSERT INTO #TEST ( groupid, label) values ( 3, 'label b')
INSERT INTO #TEST ( groupid, label) values ( 3, 'label c')
INSERT INTO #TEST ( groupid, label) values ( 4, 'label a')
INSERT INTO #TEST ( groupid, label) values ( 4, 'label b')
INSERT INTO #TEST ( groupid, label) values ( 4, 'label d')



SELECT LabelString, COUNT(*) as Aantal 
FROM (

SELECT groupid, STUFF((SELECT ',' + label FROM #test WHERE groupid = t.groupid ORDER BY 1 ASC FOR XML PATH('')),1, 1, '') AS LabelString
FROM #test t
GROUP BY GroupId 
)A
GROUP BY LabelString


Dit geeft
label a,label b	1
label a,label b,label c	2
label a,label b,label d	1

Simpel voorbeeldje, maar wellicht is dit waar je naar op zoek bent? Alle labels binnen een groep worden achter elkaar geplakt, en daar doe je een count op icm group by
Bedankt voor je reactie, dit schijnt te werken..! :)

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Nog een vraagstuk waar ik tot nu toe nog niet uit ben gekomen, weet geeneens of dit technisch wel mogelijk is binnen SQL:

Ik heb dus de waarden van 1 kolom uit verschillende rijen op 1 rij achter elkaar gezet. Nu wil ik per rij een extra kolom ophalen, een bedrag. Dit werkt aardig maar nu krijg ik alle waarden steeds dubbel vermeld omdat deze alleen natuurlijk een ander bedrag hebben. Het liefst zou ik dus zoals de oude situatie een label 1x maal zien maar dan met het totaalbedrag erachter van alle soortgelijke labels binnen die groep.

Is dit uberhaupt haalbaar?

Voorbeeld: Dus als label A 3x voorkomt en deze bedragen hebben van 20, 30 en 70 dan wil ik A éémaal zien met 120 erachter..

[ Voor 9% gewijzigd door Xanthium op 10-05-2012 18:01 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Dan moet je je eens gaan verdiepen in GROUP BY in combinatie met SUM, daarmee moet je er wel komen.

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1