Toon posts:

SQL vraagje

Pagina: 1
Acties:

Vraag


  • it0
  • Registratie: April 2000
  • Laatst online: 15-09-2022

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: 21:26
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: 23:04
Je zoekt MIN() en GROUP BY()

- knip -


Acties:
  • +2Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 21:38
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: 26-03 10:53

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: 23:06
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: 23:04
Ik was een flinke dosis niet wakker. TS noemt inderdaad "laatste".

- knip -


Acties:
  • +1Henk 'm!

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

Acties:
  • +1Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 21:38
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: 21:26
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: 15-09-2022

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


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee