[MSSQL] juiste manier ordenen van dataset

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
Ik heb een dataset dat eruit ziet als volgt:

RegelUserNameIp
1AA
2BA
3CB
4DB
5AC
6EC


Tweede column stelt een soort van Match kolom voor. Eerste regel heeft dus een match met regel twee op IP met twee verschillende Usernamen. Het kan echter voor komen dat een Username die matched op regel 1 met 2 ook, zoals in dit voorbeeld met regel 5 en 6, matched op een andere regel met een andere username dan regel 1 + 2.
Wat ik als resultaat wil is dat ik een regel krijg met Match: (Username)A + B + E(IP is vervolgens niet belangrijk). Volgens mij is dit redelijk lastig binnen MSSQL dus wellicht is ook een optie om het resultaat te laten zijn(als dat uberhaupt makkelijker is):

Username, Hash/uniekewaarde per match?
A 123
B 123
E 123
C 321
D 321

Ik ken helaas niet alle MSSQL functies en met google weet ik ook niet de juiste keywords te gebruiken dus mocht iemand mij in een goede richting helpen graag!

[ Voor 4% gewijzigd door maxtz0r op 06-02-2015 10:55 ]

Dying is God's way of telling you, you've been FIRED.


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
De probleemstelling is me niet helemaal duidelijk. Wil je, gegeven een username, alle andere usernames die een keer vanaf hetzelde IP gebruikt zijn krijgen? Of wil je die lijst voor élke username krijgen?

In het eerste geval kan je gewoon je tabel op zichzelf joinen op kolom 'ip'; het tweede geval is wat lastiger omdat je dan eigenlijk een tweedimensionale dataset wilt hebben, maar moet met een pivot table te doen zijn.

Acties:
  • 0 Henk 'm!

  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
ValHallASW schreef op vrijdag 06 februari 2015 @ 13:13:
De probleemstelling is me niet helemaal duidelijk. Wil je, gegeven een username, alle andere usernames die een keer vanaf hetzelde IP gebruikt zijn krijgen? Of wil je die lijst voor élke username krijgen?

In het eerste geval kan je gewoon je tabel op zichzelf joinen op kolom 'ip'; het tweede geval is wat lastiger omdat je dan eigenlijk een tweedimensionale dataset wilt hebben, maar moet met een pivot table te doen zijn.
Het tweede, ik wil per username zien welke usernamen een match hebben. Dus stel Jan en Piet hebben een match op IP en Piet en Klaas hebben een match op een ander IP wil ik eigenlijk zien dat Jan, Piet en Klaas dus een match hebben gehad.

Ik ga eens duiken in Pivot tabellen, vermoed dat ik het daarmee wel aan de praat moet krijgen.

Dying is God's way of telling you, you've been FIRED.


Acties:
  • 0 Henk 'm!

  • avdongen
  • Registratie: November 2006
  • Laatst online: 29-09 20:10
Volgens mij kom je al een heel eind met een join met dezelfde tabel:
code:
1
select a.username, b.username from mytable a, mytable b where a.ip = b.ip and a.username < b.username

Q: Why do developers like Dark Mode? A: Because light attracts bugs!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-10 22:15

Janoz

Moderator Devschuur®

!litemod

Je probleem uitleggen werkt makkelijker wanneer je niet dezelfde letters voor IP en Gebruiker gebruikt. Misschien is het makkelijker praten wanneer je het volgende gebruikt:

RegelUserNameIp
1Ax
2Bx
3Cy
4Dy
5Az
6Ez


Dit probleem oplossen is misschien wat lastig in een enkele query aangezien je vooraf niet weet hoeveel groepen je gaat krijgen. Ik zou aanraden om een extra kolom toe te voegen met een groep nummer en deze vervolgens te vullen met bijvoorbeeld het Tarjan union find algoritme.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'