[SQLite] select distinct maar dan net anders..

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Lexus!
  • Registratie: December 2003
  • Niet online
Ik zit met een SQLite query probleem waarbij ik al veel gezocht heb maar twijfel of het uberhaubt kan... Ik heb een tabel met enkele kolommen waaronder:

code:
1
2
3
4
5
6
7
8
id, categorie, resultaat
1, A, 1
2, A, 2
3, A, 3
4, B, 3
5, B, 4
6, C, 3
7, A, 2


Nu wil ik een lijst genereren waarbij het veld categorie uniek is, maar waarbij ik wel alle kolommen terugkrijg. Normaal zou je 1 veld distinct kunnen opvragen, maar dat werkt blijkbaar niet bij meerdere kolommen. Op een of andere manier moet ik aangeven dat ik van elke categorie maar 1 resultaat terug wil zien, gebaseerd op het hoogste id.

Dit werkt uiteraard, maar ik wil ook andere kolommen terugkrijgen:
code:
1
SELECT distinct categorie FROM tabel


Hiervan zou ik willen dat het werkt, het unieke wordt bepaald door het hoogste id.
code:
1
SELECT id, distinct categorie, resultaat FROM tabel


Het resultaat zou dan moeten zijn:
code:
1
2
3
5, B, 4
6, C, 3
7, A, 2


Dit krijg ik niet voor elkaar zonder voor elke categorie een extra query te moeten doen. Is dit mogelijk zonder voor elk resultaat een nieuwe query uit te voeren?

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 14:43

The Eagle

I wear my sunglasses at night

Al naar een GROUP BY clausule gekeken? :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
^ Wat hij zegt; Hoe werkt dat GROUP BY nu eigenlijk? met aggregates als MAX() en een HAVING.

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


Acties:
  • 0 Henk 'm!

  • Lexus!
  • Registratie: December 2003
  • Niet online
Juist ja, dit was precies waar ik al bang voor was... Een kant en klare, blijkbaar simpele oplossing (blij dat hij er is hoor!). Blijkbaar toch met verkeerde zoektermen gezocht. De link van RobIII is bookmarked, mijn oplossing is uiteindelijk:

SQL:
1
SELECT max(id), categorie, resultaat FROM tabel GROUP BY categorie


Hoe simpel kan het zijn... *zucht* Thanx!

[ Voor 3% gewijzigd door Lexus! op 24-02-2012 17:14 ]


Acties:
  • 0 Henk 'm!

  • DEiE
  • Registratie: November 2006
  • Laatst online: 16-08 19:21
Ik zou bij deze query alleen even goed in de gaten houden wat er met resultaat gebeurd, gezien dit veld schijnbaar wel opgehaald wordt, maar niet in de group by terugkomt of in een functie zoals max staat. Wellicht doet hij iets raars, zoals de bovenste ophalen ofzo.

Acties:
  • 0 Henk 'm!

  • Lexus!
  • Registratie: December 2003
  • Niet online
Dat is toch gewaarborgd doordat ik de max van een unieke waarde opvraag? Uitgangspunt is dat categorie vaker voorkomt, met verschillende resultaten. Maar van elke categorie wil ik het resultaat zien van het record met het hoogste id.

Acties:
  • 0 Henk 'm!

  • DEiE
  • Registratie: November 2006
  • Laatst online: 16-08 19:21
SQL:
1
SELECT a, b FROM Table GROUP BY a


SQL Server, Oracle en andere fatsoenlijke databases slikken deze query niet. Om SQL2000 vrij te citeren:

Column 'Table.B' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Waarom zegt ie dat? Kijk eens mee naar de tabel waar we deze query op doen. We vragen hem te groeperen op identieke waarden in kolom A. Echter, als we dat doen, welke waarde van B moeten we dan selecteren bij waarde 1 in A? Daar kan je zowel 1 als 2 bij verwachten in kolom B, en omdat dat niet gespecificeerd is staat de database het terecht niet toe.

MySQL is een hele brakke database, die deze laatste constructie wel toestaat. En volgens de handleiding is het 'by design' dat je vervolgens random waardes in kolom B aantreft. Don't do it.
SQLite heeft schijnbaar hetzelfde probleem.

Wat jij in je query doet, is vragen om de maximum waarde van Id binnen de group op categorie. Deze vraag je op, hier filter je niet op.

[ Voor 6% gewijzigd door DEiE op 24-02-2012 16:42 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Ja, maar dat is niet wat je nu aan het opvragen bent. Max is niet een functie die een specifiek record selecteerd en dan de bijbehorende rest van de kolommen teruggeeft. Max neemt gewoon een verzameling getallen ((deel van )een kolom) en geeft daarvan het grootste terug. Op dit moment wordt er gewoon een willekeurig resultaat terug gegeven.

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


Acties:
  • 0 Henk 'm!

  • DEiE
  • Registratie: November 2006
  • Laatst online: 16-08 19:21
Overigens ben je wel op de goede weg. Uit je eerste query komt per categorie het hoogste Id. Dit Id kan je vervolgens gebruiken om de volledige rijen te selecteren, omdat het Id uniek is. Het keyword waar je op moet zoeken zijn subquery en IN.

opzet van de query:
SQL:
1
select * from table where column IN (subquery)

Acties:
  • 0 Henk 'm!

  • Lexus!
  • Registratie: December 2003
  • Niet online
Juist ja, op zich ook weer logisch, de functie max() geldt natuurlijk alleen voor die kolom...

Dan zou dit hem moeten zijn:
SQL:
1
SELECT * FROM tabel WHERE id IN (SELECT MAX(id) FROM tabel GROUP BY categorie)


Edit: Getest, dit is de oplossing :)

[ Voor 12% gewijzigd door Lexus! op 27-02-2012 14:17 ]

Pagina: 1