[sql] probleem met 'distinct' select

Pagina: 1
Acties:

  • paragon
  • Registratie: April 2000
  • Laatst online: 22-08 15:37
Ik probeer uit een tabel waar sommige name meerdere malen voorkomen elke naam 1x te selecteren, met als onderscheid dat het record met de maximale waarde in een bepaalde colom in het resultaat komt.

________________________
| ID | Name | Car | PB | hih |
---------------------------------
| 01 | Name1 | ... | 1.21 | ... |
| 02 | Name2 | ... | 1.19 | ... |
| 03 | Name3 | ... | 1.22 | ... |
| 04 | Name1 | ... | 1.18 | ... |
| 05 | Name4 | ... | 1.16 | ... |
---------------------------------

Ik heb al verschillende manieren geprobeerd: Distinct Group By etc... maar geen geeft een resultaat, meestal krijg ik een error...

hoe krijg ik nou alle velden in het resultaat, maar van de records met Name1 alleen degene met de laagste PB.

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

select Name, MIN(PB)
from tabel
group by Name

:?

Exact expert nodig?


Verwijderd

Met de group by functionaliteit kan je min en de max aangeven. Je kan ook de first en de last (en nog veel meer) aangeven.

SQL:
1
2
3
SELECT ID, First(Name) as eFirstName, Max(PB) as eMaxPB 
FROM tblNameCar
GROUP BY ID


ff uit het hoofd, dus testen is misschien wel handig :7

edit:

Crazy D was me voor

[ Voor 7% gewijzigd door Verwijderd op 14-05-2003 10:51 ]


  • paragon
  • Registratie: April 2000
  • Laatst online: 22-08 15:37
hmm ik krijg bij het uitvoeren van bijvoorbeeld:
code:
1
2
3
4
SELECT Name, Car, Min(PB), hih 
FROM tblRing 
GROUP BY Name 
ORDER BY PB
de volgende foutmelding:

You tried to execute a query that does not include the specified expression 'Car' as part of an aggregate function.

bij de tweede aangedragen mogelijkheid krijg ik dezelfde soort foutmelding.

[ Voor 3% gewijzigd door paragon op 14-05-2003 11:40 ]


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 22-08 10:56

Delphi32

Heading for the gates of Eden

Alle velden die niet gebruikt worden in een aggregaat-functie (min, max, avg,...) maar die wel in je select voorkomen, opnemen in de GROUP BY.

  • paragon
  • Registratie: April 2000
  • Laatst online: 22-08 15:37
Ik heb nu de volgende select alleen komen dubbele namen nog steeds voor in het resultaat:
code:
1
2
3
4
SELECT Name, Car, Min(PB) as PB, hih 
FROM tblRing 
GROUP BY Name, Car, PB, hih 
ORDER BY PB

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09:44

Dido

heforshe

Natuurlijk, want als jij een name1 hebt en daarbij komen een car1 en een car2 voor, dan krijg je name1, car1 en name1, car2 terug. Als je dat niet wilt moet je besluiten wat j ewel wilt :)

Wat betekent mijn avatar?


  • paragon
  • Registratie: April 2000
  • Laatst online: 22-08 15:37
haha ik wil dus alleen 1x name1 los van Car maar wel de name1 met laagste PB

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09:44

Dido

heforshe

Waarom select je dan Car? Als je het daar los van wilt zien moet je 'm niet selecteren. En dat geldt ook voor de andere velden.

Als je die velden wel wilt, wil je ze dan allemaal, of de hoogste, of de laagste...?

Als je ze allemaal wilt krijg je uiteraard meer keren dezelfde name terug :)

Wat betekent mijn avatar?


  • paragon
  • Registratie: April 2000
  • Laatst online: 22-08 15:37
Ik wil alle velden maar alleen van elke naam het record met beste PB. IS dat niet mogelijk dan?

Het is dus de bedoeling dat de nummer 8 op de volgende pagina niet verschijnt in het resultaat van de query:

http://www32.brinkster.com/GTR2002/thering.asp

[ Voor 47% gewijzigd door paragon op 14-05-2003 13:50 ]


Verwijderd

Probeer eens:
code:
1
2
3
4
5
select id, name, car, pb, hih
from tblring
where name & pb in (select name & min(pb)
                                  from tblring
                                  group by name)

En ik ga het niet uitleggen want volgens mij wil je het toch niet snappen :)

[ Voor 4% gewijzigd door Verwijderd op 19-05-2003 10:23 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09:44

Dido

heforshe

Als je deze zin eens vertaalt naar SQL:
"Selecteer alles uit de tabel war de PB minimaal is voor de naam":
code:
1
2
SELECT A.* from tabel A
WHERE PB = SELECT MIN(B.PB) FROM tabel B WHERE A.name = B.NAME

Wat betekent mijn avatar?


  • paragon
  • Registratie: April 2000
  • Laatst online: 22-08 15:37
Hmm ik krijg het niet voor elkaar ik heb zowel de versie van MrDreamOn als die van Dido geprobeerd.
code:
1
2
3
4
SELECT id, name, car, pb, hih 
FROM tblring 
WHERE name & pb in (SELECT name, min(pb)  from tblRing) 
GROUP BY name
Geeft me de volgende error:
You have written a subquery that can return more than one field without using the EXISTS reserved word in the main query's FROM clause. Revise the SELECT statement of the subquery to request only one field

De versie van Dido volgens mij correct overgenomen geeft een syntax error.
code:
1
2
3
4
5
SELECT *
FROM tblRing 
WHERE tblRing.PB = SELECT MIN(B.PB) 
                   FROM tblRing AS B 
                   WHERE tblRing.Name = B.Name

[ Voor 5% gewijzigd door paragon op 14-05-2003 14:36 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09:44

Dido

heforshe

Voeg ook eens een alias toe bij de eerste from (tblRing AS A)?

Wat betekent mijn avatar?


  • paragon
  • Registratie: April 2000
  • Laatst online: 22-08 15:37
Net geprobeerd maar de syntax error blijft hetzelfde:

Syntax error. in query expression 'A.PB = SELECT MIN(PB) FROM tblRing AS B WHERE A.Name = B.Name'.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09:44

Dido

heforshe

En met A.PB IN (SELECT ..... ) ?

Je werkt toch niet met MySQL of zo, hè, dat je geen subqueries mag hebben...

Wat betekent mijn avatar?


Verwijderd

SELECT A.NAME,A.CAR FROM TABEL A WHERE A.PB IN (SELECT MAX(B.PB) FROM TABEL B GROUP BY B.NAME)

  • paragon
  • Registratie: April 2000
  • Laatst online: 22-08 15:37
Dido: nee geem mysql hier maar wel acces maar die doet ook joins dus die zal een subquery ook wel aankunnen hoop ik.

vteuniss: jij hebt hem gevonden die werkt :)
Pagina: 1