[SQL] Volgorde bepalen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • KopjeThee
  • Registratie: Maart 2005
  • Niet online
Ik heb sterk het gevoel dat ik iets eenvoudigs over het hoofd zie, maar ik heb het volgende probleem.
Ik heb wat punten waar ik herhaaldelijk in een bepaalde volgorde langskom.
Maar soms als ik langs die punten kom, sla ik iets over.
Bijvoorbeeld:
1) a,b,c,d,e
2) b,c,e,f
Nu wil ik bepalen wat de volgorde van de punten is (en nee, ze staan niet per se op alphabet). We mogen er vanuit gaan dat deze uniek bepaald is.
In dit geval zou je dus krijgen:
a,b,c,d,e,f

Ik heb een tabel die er ongeveer zo uitziet:
run,punt,volgorde
1,a,1
1,b,2
1,c,3
1,d,4
1,e,5
2,b,1
2,c,2,
2,e,3
2,f,4

Ik heb nog geen handige query kunnen verzinnen. Hebben jullie een idee?

Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 08-09 16:22
SQL:
1
SELECT `punt` FROM `tabel` GROUP BY `punt` ORDER BY `run`, `volgorde`


Zoiets?

[ Voor 8% gewijzigd door StephanVierkant op 11-11-2011 10:17 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dit moet in een query gegoten worden? Dat gaat je niet lukken tenzij je 'run' niet nodig hebt in 't resultaat (en dan nog blijft 't een smerige manier van groupen op volgorde, punt en dan orderen op volgorde, punt).

Maar het zou handiger zijn als je wat meer context gaf en 't wat minder abstract maakte. Ook zou het fijn zijn als je liet zien wat je zelf al hebt geprobeerd en met welk RDBMS je bijvoorbeeld werkt. Ik haalde pas uit de laatste zin uit 't woordje "query" dat 't hier uberhaupt op SQL gaat; tot die tijd dacht ik dat we 't gewoon over arrays met gegevens hadden die in een willekeurige programmeertaal gebruikt moest worden.
Stephan4kant schreef op vrijdag 11 november 2011 @ 10:16:
SQL:
1
SELECT `punt` FROM `tabel` ORDER BY `run`, `volgorde`


Zoiets?
Daar zou dan gewoon a, b, c, d, e, b, c, e, f uit komen. Stiekem editten :P Maar ook die query gaat volgens mij niet werken noch 't gewenste resultaat geven.

[ Voor 42% gewijzigd door RobIII op 11-11-2011 10:20 ]

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!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Stephan4kant schreef op vrijdag 11 november 2011 @ 10:16:
SQL:
1
SELECT `punt` FROM `tabel` GROUP BY `punt` ORDER BY `run`, `volgorde`


Zoiets?
Wat heeft GROUP BY hier te zoeken? Er is in geen velden of wegen een aggregate functie te vinden, bv. SUM, COUNT of AVG.

Acties:
  • 0 Henk 'm!

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

We mogen er vanuit gaan dat deze uniek bepaald is.
Hier wringt de schoen een beetje. Bij onbreken van een basis voor de volgorde gaan we knoeien met een hardgecodeerde volgorde in de je tabel. mischien kun je ons iets meer vertellen daarover

Als elk punt een vaste positie heeft in de volgorde kun je deze beter huisvesten in een nieuwe tabel
e.g.

Tabel runlog oid
|run|punt|

Tabel puntproperties
|punt|property|value|

[ Voor 27% gewijzigd door Fish op 11-11-2011 10:30 ]

Iperf


Acties:
  • 0 Henk 'm!

  • KopjeThee
  • Registratie: Maart 2005
  • Niet online
OK, ik wil dus adhv alle runs de volgorde bepalen. Ik mag er van uitgaan dat dit op een eenduidige manier lukt.

Wat ik zelf heb geprobeerd, maar tamelijk omslachtig is:
Iteratief de punten op volgorde zetten.
1) Pak het punt dat in geen enkele run op plek 2 of hoger staat. Dit is het eerste punt.
2) Zet dit punt op de 1e plek.
3) Verwijder dit punt uit de runs. En pas de volgorde van punten uit de runs aan.
4) Herhaal dit totdat alle runs leeg zijn, en er dus geen punten meer zijn.

[ Voor 4% gewijzigd door KopjeThee op 11-11-2011 11:40 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als je een dergelijk algoritme schrijft, kan je beter eerst zoeken naar de run met de meeste punten. Is punten gelijk aan max punten, ben je namelijk direct klaar. :)

Dit soort algo's kunnen niet in een query, je zou wel een query kunnen maken welke voor alle punten alle mogelijke lagere en hogere waardes geeft. Daarna zou de code ook niet al te moeilijk moeten zijn.

O enne, de query van Stephan slaat eerlijk gezegd nergens over. Nofi, maar je kan beter bovenstaande aanpakken gaan uitwerken ipv die query te gaan verbeteren.

{signature}


Acties:
  • 0 Henk 'm!

  • CaVeFiSh
  • Registratie: Januari 2005
  • Laatst online: 27-03 14:26
Denk dat je hier wel wat aan heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT [Run]
            ,[Punt]
            ,ROW_NUMBER() OVER (PARTITION BY [Run] ORDER BY [Punt]) AS [Volgorde]
FROM (
SELECT 1 AS [Run], 'a' AS [Punt]
UNION SELECT 1 AS [Run], 'b' AS [Punt]
UNION SELECT 1 AS [Run], 'c' AS [Punt]
UNION SELECT 1 AS [Run], 'd' AS [Punt]
UNION SELECT 1 AS [Run], 'e' AS [Punt]
UNION SELECT 2 AS [Run], 'b' AS [Punt]
UNION SELECT 2 AS [Run], 'c' AS [Punt]
UNION SELECT 2 AS [Run], 'e' AS [Punt]
UNION SELECT 2 AS [Run], 'f' AS [Punt]
) X


(MSSQL 2008 werkt dit goed, voor mysql zullen ook wel gelijke functies bestaan maar weet ik niet zeker)

[ Voor 9% gewijzigd door CaVeFiSh op 11-11-2011 15:18 ]

http://eu.battle.net/d3/en/profile/cavefish-2679/

Pagina: 1