Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

SQL vraagje

Pagina: 1
Acties:

Vraag


  • it0
  • Registratie: april 2000
  • Laatst online: 09-05 23:31

it0

Mijn mening is een feit.

Topicstarter
Het is even geleden dat ik met SQL heb gespeeld, heb gezocht , maar mis de woordenschat om goed te zoeken.

Stel de volgende 2 tabellen
Fruit:
ID,Fruit
1,Appel
2,Banaan
3,Citroen

Prijs:
ID,Prijs,Datum
1,1.25,"2021-3-15 21:36"
2,0.75,"2021-3-15 21:36"
3,0.65,"2021-3-15 21:36"
1,1.20,"2021-2-15 21:36"
2,0.74,"2021-2-15 21:36"
3,0.66,"2021-2-15 21:36"

Wat is de SQL om de laatste prijs te krijgen per fruit?
dus bv het volgende resultaat.
Appel, 1.25 , "2021-3-15 21:36"
Banaan, 0.75 , "2021-3-15 21:36"
Citroen, 0.65 , "2021-3-15 21:36"

Ik heb met een subselect zitten spelen maar ik loop vast.

Beste antwoord (via it0 op 17-03-2021 04:26)


  • danslo
  • Registratie: januari 2003
  • Laatst online: 01:58
mjax schreef op dinsdag 16 maart 2021 @ 19:13:
Misschien goed dat degene die aandragen om het met Group-wise Maximum en Minimum op te lossen een daadwerkelijk voorbeeld laten zien. Want eerlijk gezegd zie ik nog niet hoe je de vraag van TS daarmee oplost. Ik wil natuurlijk graag leren van de professionals hier.
Iets te vluchtig over de TS heen gelezen, dus voorbeelden in bovenstaande link zijn niet 1 op 1 over te nemen. Maar kan prima met dubbele join:

SQL:
1
2
3
4
SELECT naam, p.prijs, p.datum FROM fruit f 
LEFT JOIN prijs p ON p.id = f.id
LEFT JOIN prijs pp ON pp.id = p.id AND pp.datum > p.datum 
WHERE pp.id IS NULL;


edit: e.v.t. met een GROUP BY id, aangezien het allemaal dezelfde tijden zijn in de OP.

[Voor 194% gewijzigd door danslo op 16-03-2021 20:24]

Alle reacties


Acties:
  • +3Henk 'm!

  • Raymond P
  • Registratie: september 2006
  • Laatst online: 14:41
Je zoekt MIN() en GROUP BY()

- knip -


Acties:
  • +2Henk 'm!

  • mjax
  • Registratie: september 2000
  • Laatst online: 13-06 21:55
Via een subselect:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    Fruit.*,
    (
        SELECT
            Prijs.Prijs
        FROM
            Prijs
        WHERE
            Prijs.ID = Fruit.ID
        ORDER BY
            Prijs.Datum DESC
        LIMIT 
            0, 1
    ) AS Laatste_Prijs
FROM 
    Fruit


Dit is MySQL syntax. Voor andere databases zul je de LIMIT constructie moeten aanpassen.

Of via JOINs:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    Fruit.*,
    Prijs.Prijs
FROM
    Fruit
LEFT JOIN (
    SELECT
        Prijs.ID,
        MAX(Prijs.Datum) AS Datum
    FROM
        Prijs
    GROUP BY
        Prijs.ID
) AS Laatste_Prijs_Datum_Per_Fruit ON Laatste_Prijs_Datum_Per_Fruit.ID = Fruit.ID
LEFT JOIN
    Prijs ON Prijs.ID = Laatste_Prijs_Datum_Per_Fruit.ID AND Prijs.Datum = Laatste_Prijs_Datum_Per_Fruit.Datum


In beide gevallen krijg je ook records terug voor fruit waar geen prijs voor bekend is. Als dat niet is gewenst, moet je in de JOIN oplossing beide LEFT JOINs vervangen door INNER JOINs. Voor de subselect oplossing zou je een GROUP BY en HAVING moeten toevoegen.

[Voor 162% gewijzigd door mjax op 16-03-2021 06:24]


Acties:
  • +1Henk 'm!

  • Woy
  • Registratie: april 2000
  • Niet online

Woy

Moderator Devschuur®
@mjax ik zou in deze niet aanraden om een subselect te doen. De query wordt daar een stuk minder leesbaar van, en in deze oplossing is het prima op te lossen met een simpele group by en MIN aggregate zoals @Raymond P aandraagt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • +3Henk 'm!

  • Knutselsmurf
  • Registratie: december 2000
  • Laatst online: 15:23

Knutselsmurf

LED's make things better

Er is wel een subtiel verschil tussen het gebruik van MIN() en de getoonde voorbeelduitvoer van TS. In die voorbeelduitvoer wordt namelijk ook een datum getoond. Ik neem daarom aan dat TS ook terug wil zien waarop die laagste prijs van toepassing was.

Als dat inderdaad zo is, dan is alleen MIN() niet voldoende. Je wilt dan immers niet alleen weten wat de laagste prijs was, maar ook wanneer ( kan meerdere momenten zijn).

- This line is intentionally left blank -


Acties:
  • +1Henk 'm!

  • Woy
  • Registratie: april 2000
  • Niet online

Woy

Moderator Devschuur®
@Knutselsmurf ja daar heb je gelijk in, ik had niet de volldige vraag goed gelezen. Toch zou ik blijven adviseren om niet al te snel naar sub-query's te grijpen, want het is vaak helemaal niet nodig.

Zoekterm voor de TS is overigens dan Groupwise Maximum ( en Minimum ;) )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • +1Henk 'm!

  • DJMaze
  • Registratie: juni 2002
  • Niet online
Het wordt nog leuker als het van een specifieke dag wilt weten.

zoals een hotel kamer in seizoenen of als je de prijs van banaan in de toekomst al wil instellen.

[Voor 26% gewijzigd door DJMaze op 16-03-2021 11:44]

Maak je niet druk, dat doet de compressor maar


Acties:
  • +1Henk 'm!

  • Sharkware
  • Registratie: november 2003
  • Laatst online: 14:15
Knutselsmurf schreef op dinsdag 16 maart 2021 @ 11:22:
Er is wel een subtiel verschil tussen het gebruik van MIN() en de getoonde voorbeelduitvoer van TS. In die voorbeelduitvoer wordt namelijk ook een datum getoond. Ik neem daarom aan dat TS ook terug wil zien waarop die laagste prijs van toepassing was.

Als dat inderdaad zo is, dan is alleen MIN() niet voldoende. Je wilt dan immers niet alleen weten wat de laagste prijs was, maar ook wanneer ( kan meerdere momenten zijn).
Volgens mij gaat het niet om de laagste prijs maar om de "laatste" prijs als ik naar het voorbeeld kijk.

Acties:
  • +3Henk 'm!

  • Raymond P
  • Registratie: september 2006
  • Laatst online: 14:41
Ik was een flinke dosis niet wakker. TS noemt inderdaad "laatste".

- knip -


Acties:
  • +1Henk 'm!

  • danslo
  • Registratie: januari 2003
  • Laatst online: 01:58
Je bent op zoek naar de term Group-wise Maximum. Vervang prijs door datum ;)

Acties:
  • +1Henk 'm!

  • mjax
  • Registratie: september 2000
  • Laatst online: 13-06 21:55
Misschien goed dat degene die aandragen om het met Group-wise Maximum en Minimum op te lossen een daadwerkelijk voorbeeld laten zien. Want eerlijk gezegd zie ik nog niet hoe je de vraag van TS daarmee oplost. Ik wil natuurlijk graag leren van de professionals hier.

Acties:
  • Beste antwoord
  • +2Henk 'm!

  • danslo
  • Registratie: januari 2003
  • Laatst online: 01:58
mjax schreef op dinsdag 16 maart 2021 @ 19:13:
Misschien goed dat degene die aandragen om het met Group-wise Maximum en Minimum op te lossen een daadwerkelijk voorbeeld laten zien. Want eerlijk gezegd zie ik nog niet hoe je de vraag van TS daarmee oplost. Ik wil natuurlijk graag leren van de professionals hier.
Iets te vluchtig over de TS heen gelezen, dus voorbeelden in bovenstaande link zijn niet 1 op 1 over te nemen. Maar kan prima met dubbele join:

SQL:
1
2
3
4
SELECT naam, p.prijs, p.datum FROM fruit f 
LEFT JOIN prijs p ON p.id = f.id
LEFT JOIN prijs pp ON pp.id = p.id AND pp.datum > p.datum 
WHERE pp.id IS NULL;


edit: e.v.t. met een GROUP BY id, aangezien het allemaal dezelfde tijden zijn in de OP.

[Voor 194% gewijzigd door danslo op 16-03-2021 20:24]


  • it0
  • Registratie: april 2000
  • Laatst online: 09-05 23:31

it0

Mijn mening is een feit.

Topicstarter
Van die laaste join krijg ik hoofdpijn, maar het werkt als een tierelier!

Bedankt voor alle suggesties!

[Voor 19% gewijzigd door it0 op 17-03-2021 04:28]

Pagina: 1


Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True