Toon posts:

[SQL] Resultaten nummeren

Pagina: 1
Acties:
  • 262 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Stel het volgende:

(feitelijk gewoon het Champions League model)

Er zijn twee poules met ieder vier voetbalploegen: A en B

A
-----
T1
T2
T3
T4

B
-----
T5
T6
T7
T8

Deze ploegen spelen uit en thuis tegen elkaar, dus zes wedstrijden per team. Voor poule A:

ronde1:
T1 tegen T2
T3 tegen T4

ronde2
T1 tegen T3
T2 tegen T4

ronde3:
T1 tegen T4
T2 tegen T3

ronde4:
T2 tegen T1
etc.

Met wat sql-queries kan je dus simpel uitrekenen hoeveel punten ieder team heeft na iedere ronde.

Zo kom je bijvoorbeeld tot het volgende resultaat:


==================================
Query - Reken de stand na de derde rond uit:

Poule A
----------------
T1 - 7 punten
T2 - 6 punten
T3 - 3 punten
T4 - 1 punt

Poule B
-----------------
T5 - 9 punten
T6 - 4 punten
T7 - 3 punten
T8 - 1 punt


Mijn probleem
Ik wil nu het volgende kunnen uitrekenen:
Iemand die na ronde drie op de derde plek in de poule staat, waar staat die als alle wedstrijden zijn gespeeld (dus na 6 speelrondes).

Het lastige is, dat ik geen idee heb hoe ik via een query posities kan achterhalen. Ja, ik kan de nummer 1 opvragen, door de hoogste score op te vragen, en ik kan de laatste opvragen door de kleinste score op te halen. Maar een willekeurig ander nummer dat weet ik niet zo snel.


Sorry voor het lange bericht, maar heeft iemand enig idee hoe dit opgelost kan worden?

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 01-05 13:23
Verwijderd schreef op 22 oktober 2004 @ 10:48:
Het lastige is, dat ik geen idee heb hoe ik via een query posities kan achterhalen. Ja, ik kan de nummer 1 opvragen, door de hoogste score op te vragen, en ik kan de laatste opvragen door de kleinste score op te halen. Maar een willekeurig ander nummer dat weet ik niet zo snel.
Is het persé van belang dat je elke positie apart per poule uit de database haalt? Kun je niet gewoon per poule selecteren en dan sorteren op het aantal punten?

Verwijderd

Topicstarter
Postman schreef op 22 oktober 2004 @ 10:57:
[...]

Is het persé van belang dat je elke positie apart per poule uit de database haalt? Kun je niet gewoon per poule selecteren en dan sorteren op het aantal punten?
Ow, ik moet er nog bijvertellen dat het uiteindelijk om een soort statistische analyse gaat.

Stel je hebt de afgelopen 5 jaar championsleague, dan heb je per jaar 8 poules, is dus 40 poules in totaal.

Je kan hiermee bijvoorbeeld uitrekenen hoeveel procent van de teams die na de derde ronde derde staan toch uiteindelijk doorgaan (dus 1e of 2e worden in de poule).

De computer moet dus enig benul hebben van posities in de poule.

Dit is goed te doen als ik dit programmeer in C#, maar is dit ook te doen in sql-queries?

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 01-05 13:23
In puur en alleen SQL wordt dit vrij lastig denk ik. Je kunt natuurlijk eerst de hoogste en laagste waarde pakken (doormiddel van MAX & MIN), deze in een subquery gebruiken om daarmee weer de waardes te pakken die tussen de hoogste en laagste zitten en daarover heen weer een MAX & MIN doen.
Geen nette of leesbare SQL, maar in mijn ogen de enige oplossing.

Verwijderd

Topicstarter
Postman schreef op 22 oktober 2004 @ 11:16:
In puur en alleen SQL wordt dit vrij lastig denk ik. Je kunt natuurlijk eerst de hoogste en laagste waarde pakken (doormiddel van MAX & MIN), deze in een subquery gebruiken om daarmee weer de waardes te pakken die tussen de hoogste en laagste zitten en daarover heen weer een MAX & MIN doen.
Geen nette of leesbare SQL, maar in mijn ogen de enige oplossing.
Ok, dank je.

Maar dat zou betekenen dat een serieus statistische applicatie niet met queries werkt?

Ik ga het maar eens lekker coderen met C#

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 01-05 13:23
Verwijderd schreef op 22 oktober 2004 @ 11:19:
Maar dat zou betekenen dat een serieus statistische applicatie niet met queries werkt?
Het kan wel, maar in jouw geval wordt het vrij lastig. Het moet natuurlijk wel op te lossen zijn en omdat jij net zulke specifieke eisen stelt loop je dus tegen problemen aan.

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Je kan het proberen door de resultaten te sorteren met ORDER BY en dan bv ook nog
LIMIT (2, 1) om alleen de nummer 3 te krijgen. 2 Is hier de offset en 1 het aantal te retourneren rijen.

edit: hm, bedenk me net dat dit niet ideaal is als bv 2 ploegen de derde plek delen.

[ Voor 20% gewijzigd door zwippie op 22-10-2004 17:23 ]

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • ggvw
  • Registratie: September 2001
  • Laatst online: 15-12-2024
Kan je niet iets met user variablen doen in sql?

edit:

Hiermee kan je bijvoorbeeld altijd het derde resultaat opvragen zonder dat je een limit of id-veld nodig hebt.

set @teller=0;

select (@teller:=@teller+1) as tellur, veldnaam1, veldnaam2 from tabelnaam where if(@teller=2,1=1,(@teller:=@teller+1) && 1=2);

Dit geeft altijd het derde resultaat, maar het zal vast wel beter kunnen...

[ Voor 87% gewijzigd door ggvw op 23-10-2004 10:25 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

zwippie schreef op 22 oktober 2004 @ 17:21:
Je kan het proberen door de resultaten te sorteren met ORDER BY en dan bv ook nog
LIMIT (2, 1) om alleen de nummer 3 te krijgen. 2 Is hier de offset en 1 het aantal te retourneren rijen.

edit: hm, bedenk me net dat dit niet ideaal is als bv 2 ploegen de derde plek delen.
In andere SQL-dialecten dan MySQL werkt dat sowieso niet, dan heb je iets als dit nodig:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT TOP 1 *
FROM tabel
WHERE poule = vulmaarin
  AND id IN (
    SELECT TOP (aantalrecords - positiediejewilzien) id
    FROM tabel
    WHERE poule = vulmaarin
    ORDER BY punten DESC
  )
ORDER BY punten ASC


Dus stel, je wil degene die op 2 staan laten zien, uit een poule met nummer 3, die bestaat uit 8 records:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT TOP 1 *
FROM tabel
WHERE poule = 3
  AND id IN (
    SELECT TOP (8 - 2) id
    FROM tabel
    WHERE poule = 3
    ORDER BY punten DESC
  )
ORDER BY punten ASC

Maar wederom heb je hier het probleem dat je geen gedeelde rankings kan hebben.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1