SQL Query (mssql)

Status
Niet open voor verdere reacties.

JeroenJ

Nieuwe gebruiker
Lid geworden
20 dec 2007
Berichten
1
Hoi,

Ik zit een beetje in de knoop met een sql query wat volgens mij niet zo moeilijk zou moeten zijn. :(
Ik maak momenteel gebruik van php icm een mssql (2005) database. Daar zit hem meteen het probleem, normaal gebruik ik alleen een mysql database en dan maak ik alleen simpele queries. Ik hoop dat iemand me dan ook iets verder op weg zou kunnen helpen.

De situatie:
Ik heb een script waarbij de gebruiker een afbeelding kan slepen. Na het loslaten van de afbeelding worden de coordinaten van deze afbeelding netjes weggeschreven in een tabel. Dit betekent dat als een gebruiker dezelfde afbeelding vaker sleept er een nieuwe rij in de tabel wordt aangemaakt zodat er een soort geschiedenis is.

Dit levert de volgende dataset op:

ID User_id Image_id x y
1 1 1 100.00 23.00
2 1 1 50.00 23.00
3 1 3 317.50 112.00
4 1 3 661.25 381.50
5 1 5 379.00 133.00
6 1 8 287.00 350.50
7 1 8 600.50 123.75
8 2 15 451.00 58.00
9 2 17 205.50 260.00
10 2 12 639.50 327.00
11 2 23 383.50 395.50
12 2 25 475.50 191.00
13 2 3 645.50 75.50
14 2 18 548.00 229.00
15 2 18 665.00 198.50
16 2 18 738.00 354.75
17 2 17 207.75 116.50
18 2 1 235.50 304.00


Wat ik nu eigenlijk eruit zou willen halen zijn twee dingen:

1) De gemiddelde coordinaat per afbeelding voor alle gebruikers, maar dan alleen voor de laatste 'stap/versleep beweging'. Ik ben (nog) niet geïnteresseerd in de geschiedenis.
Het lijkt me dat ik hiervoor per image_id een 'GROUP BY' moet doen, maar hoe pak ik dan alleen de meest actuele coordinaten (eigenlijk die met de hoogste id, dit is overigens een auto increment) en pak ik daar het gemiddelde van (iets met avg neem ik aan).
Om een kort verhaaltje nog korter te maken, uiteindelijk zou dit het resultaat moeten worden:

image_id x y
1 142,75 163,5
3 653,125 228,5
etc.

2) Per afbeelding de coordinaten van de verschillende gebruikers, en dan ook weer alleen voor de laatste 'stap/versleep beweging'.
Ook hier zit in een beetje in de knoop. Het lijkt me dat je dat je de hoogste id per image_id per user_id wilt pakken. Doe je dit nu ook door weer de image_id te groupen? Dan heb je alleen het probleem dat je dan ook weer alle gebruikers bij elkaar pakt.

Het resultaat zou dit moeten worden:

user_id image_id x y
1 1 50 23
2 1 235.50 304.00
1 3 661.25 381.50
2 3 645.50 75.50
etc.


Zou iemand mij verder kunnen helpen en mij een duwtje in de goede richting kunnen geven?
 
Dit is niet heel eenvoudig, je komt gebruik aan het maken van subqueries. Welke database heb je erachter hangen..? Ik kan je een query schrijven die based is op Oracle SQL en die jouw resultaten weergeeft. Heb je daar dan genoeg aan? :confused:
 
SQL query voorbeeld.

Oplossing voor deel 1:

SELECT Image_Id
, AVG(x) as x
, AVG(y) as y
FROM tbCoordinatesTable
GROUP BY Image_Id

Oplossing voor deel 2:

SELECT CT.User_Id
, CT.Image_Id
, CT.X
, CT.Y
FROM tbCoordinatesTable AS CT
WHERE CT.Id = (
SELECT TOP 1 CT2.Id
FROM tbCoordinatesTable AS CT2
WHERE CT2.User_Id = CT.User_Id
AND CT2.Image_Id = CT.Image_Id
ORDER BY CT2.Id DESC
)
ORDER BY CT.User_Id, CT.Image_ID
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan