Situatieschets
Ik heb een tabel met daarin gegevens van gebruikers. Iedere gebruiker heeft één username, en mogelijk per username meerdere aliassen, welke ieder weer een bepaalde rank hebben. Aan elke row hang ook een id, welke als het goed is unique is (column is echter niet defined als unique, database is niet door mij ontworpen
).
Nu wil ik uit deze tabel een recordset met maar één row per username, en dan wel de row met de hoogste rank. In de fictieve tabel hieronder dus de groengekleurde rows. Rank is echter niet uniek per username en er kunnen per username dus meerdere rows zijn met dezelfde rank (zie row met id 5 en 6). In dit geval pak ik de row met het laagste id.
Het probleem
Een recordset per username returnen is het probleem niet, dat lukt met een GROUP BY username. Vervolgens kan ik óók de hoogste rank erbij halen door MAX(rank) te selecten.
Het probleem is echter dat ik dus óók de bijbehorende alias wil weten, bij bovenstaande query zou ik bijvoorbeeld Foo 87 en Bar 45 als resultaat krijgen, terwijl ik ook de bijbehorende aliassen wil weten (FooB en BarB). Alias toevoegen mag van MSSQL niet omdat dit veld niet voorkomt in de GROUP BY. En nu valt me op dat ik dan alsnog een probleem heb in het geval van een rank die meerdere malen voorkomt per user, zoals in het voorbeeld. Iets zegt me dat de hele aanpak met een GROUP BY niet klopt.
Van iemand anders kreeg ik de suggestie om het als volgt te proberen:
Alleen dan krijg ik als nog:
Ik heb een tabel met daarin gegevens van gebruikers. Iedere gebruiker heeft één username, en mogelijk per username meerdere aliassen, welke ieder weer een bepaalde rank hebben. Aan elke row hang ook een id, welke als het goed is unique is (column is echter niet defined als unique, database is niet door mij ontworpen
| Id | Username | Alias | Rank |
| 1 | Foo | FooA | 21 |
| 2 | Foo | FooB | 87 |
| 3 | Bar | BarA | 21 |
| 5 | Bar | BarB | 45 |
| 6 | Bar | BarC | 45 |
Nu wil ik uit deze tabel een recordset met maar één row per username, en dan wel de row met de hoogste rank. In de fictieve tabel hieronder dus de groengekleurde rows. Rank is echter niet uniek per username en er kunnen per username dus meerdere rows zijn met dezelfde rank (zie row met id 5 en 6). In dit geval pak ik de row met het laagste id.
Het probleem
Een recordset per username returnen is het probleem niet, dat lukt met een GROUP BY username. Vervolgens kan ik óók de hoogste rank erbij halen door MAX(rank) te selecten.
SQL:
1
| SELECT username, MAX(rank) AS rank FROM data GROUP BY username |
Het probleem is echter dat ik dus óók de bijbehorende alias wil weten, bij bovenstaande query zou ik bijvoorbeeld Foo 87 en Bar 45 als resultaat krijgen, terwijl ik ook de bijbehorende aliassen wil weten (FooB en BarB). Alias toevoegen mag van MSSQL niet omdat dit veld niet voorkomt in de GROUP BY. En nu valt me op dat ik dan alsnog een probleem heb in het geval van een rank die meerdere malen voorkomt per user, zoals in het voorbeeld. Iets zegt me dat de hele aanpak met een GROUP BY niet klopt.
Van iemand anders kreeg ik de suggestie om het als volgt te proberen:
SQL:
1
| SELECT a.username, MAX(a.rank) AS rank, b.alias FROM data a INNER JOIN data b ON a.username = b.username GROUP BY a.username |
Alleen dan krijg ik als nog:
code:
Deze toevoegen aan de GROUP BY zorg weer dat ik meerdere rows per username krijg. Dit doet mij dan ook twijfelen aan de hele aanpak met een GROUP BY...
1
2
| Server: Msg 8120, Level 16, State 1, Line 1 Column 'b.alias' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. |