13
forum
|

hauturi

+3264
Liittynyt:
25.6.2014
Viestejä:
2384

Täällä on varmaan SQL-osaajia, jostain syystä oma päättely lyö nyt tyhjää.

Sanotaan että taulussa kurssit on kolme kenttää:

  • tunniste (arvopaperin yksikäsitteinen tunniste, varchar)
  • pvm (date)
  • kurssi (double)

Kullekin tunnisteelle voi siis olla useampia kursseja, kuitenkin eri päiviltä (tunniste + pvm muodostavat unique indexin)

Nyt pitäisi hakea kaikki taulussa olevat eri tunnisteet ja niiden viimeisin kurssi, riippumatta siitä miltä päivältä se on, kunhan on viimeisin?

8.3.2024 - 18:30

RedRabbit

+66
Liittynyt:
29.8.2016
Viestejä:
53

ChatGPT

Voit hakea kunkin tunnisteen viimeisimmän kurssin käyttämällä SQL-kyselyä, joka ryhmittelee tulokset tunnisteen perusteella ja käyttää MAX-funktiota valitsemaan kunkin ryhmän viimeisimmän päivämäärän. Sen jälkeen voit liittää tämän alikyselyn toiseen kyselyyn, joka hakee vastaavat kurssit kyseisiltä päivämääriltä. Tässä on esimerkki SQL-kyselystä, joka tekee tämän:

SELECT k.tunniste, k.pvm, k.kurssi
FROM kurssit k
INNER JOIN (
   SELECT tunniste, MAX(pvm) AS viimeisin_pvm
   FROM kurssit
   GROUP BY tunniste
) vk ON k.tunniste = vk.tunniste AND k.pvm = vk.viimeisin_pvm
 

Tässä kyselyssä alikysely vk hakee kunkin tunnisteen viimeisimmän päivämäärän (eli MAX(pvm)), ja ulompi kysely liittää tämän tuloksen takaisin kurssit-tauluun käyttäen INNER JOIN -lauseketta. Liitoskriteerit varmistavat, että valitaan vain rivit, jotka vastaavat kunkin tunnisteen viimeisintä päivämäärää. Tuloksena saat luettelon kaikista eri tunnisteista ja niiden viimeisimmistä kursseista, riippumatta siitä, miltä päivältä ne ovat.

trending_up +3
8.3.2024 - 19:00

hauturi

OP
+3264
Liittynyt:
25.6.2014
Viestejä:
2384

RedRabbit wrote:

ChatGPT

Voit hakea kunkin tunnisteen viimeisimmän kurssin käyttämällä SQL-kyselyä, joka ryhmittelee tulokset tunnisteen perusteella ja käyttää MAX-funktiota valitsemaan kunkin ryhmän viimeisimmän päivämäärän. Sen jälkeen voit liittää tämän alikyselyn toiseen kyselyyn, joka hakee vastaavat kurssit kyseisiltä päivämääriltä. Tässä on esimerkki SQL-kyselystä, joka tekee tämän:

SELECT k.tunniste, k.pvm, k.kurssi
FROM kurssit k
INNER JOIN (
   SELECT tunniste, MAX(pvm) AS viimeisin_pvm
   FROM kurssit
   GROUP BY tunniste
) vk ON k.tunniste = vk.tunniste AND k.pvm = vk.viimeisin_pvm
 

Tässä kyselyssä alikysely vk hakee kunkin tunnisteen viimeisimmän päivämäärän (eli MAX(pvm)), ja ulompi kysely liittää tämän tuloksen takaisin kurssit-tauluun käyttäen INNER JOIN -lauseketta. Liitoskriteerit varmistavat, että valitaan vain rivit, jotka vastaavat kunkin tunnisteen viimeisintä päivämäärää. Tuloksena saat luettelon kaikista eri tunnisteista ja niiden viimeisimmistä kursseista, riippumatta siitä, miltä päivältä ne ovat.

Kiitos. Minkälaisella promptilla ChatGPT tuon tuotti (vai käytitkö suoraan tuota minun kuvaustani)?

8.3.2024 - 19:00

varatonnit

+241
Liittynyt:
8.7.2021
Viestejä:
171

Seuraava toimii myös: SELECT DISTINCT ON (tunniste) tunniste, pvm, kurssi FROM kurssit order by tunniste, pvm DESC

Mutta olisko jokin variantti ylemmästä viestistä mahdollisesti vähän tehokkaampi isoilla määrillä rivejä, kun ei tarvitse (luulisin?) kaikkea sortata kyselyn aikana.

8.3.2024 - 19:06

RedRabbit

+66
Liittynyt:
29.8.2016
Viestejä:
53

hauturi wrote:

Kiitos. Minkälaisella promptilla ChatGPT tuon tuotti (vai käytitkö suoraan tuota minun kuvaustani)?

Kopioin suoraan aloituspostauksesi, ei muuta.

trending_up +2
8.3.2024 - 19:27

hauturi

OP
+3264
Liittynyt:
25.6.2014
Viestejä:
2384

varatonnit wrote:

Seuraava toimii myös: SELECT DISTINCT ON (tunniste) tunniste, pvm, kurssi FROM kurssit order by tunniste, pvm DESC

Ei toimi ainakaan MariaDB:ssä (MySQL:ssä) - vaikka jättää tuon ON pois, mikä ei ole MariaDB:n syntaksin mukainen. Tulee kaikkien päivien kurssit

trending_up +1
8.3.2024 - 19:36

hauturi

OP
+3264
Liittynyt:
25.6.2014
Viestejä:
2384

On pari kieltä, jotka olisi pitänyt opetella kunnolla nuorempana, toinen on ranska ja toinen on SQL.

Toisaalta vaikka ymmärsin SQL:n hienoudet ja aloin vähän paremmin tutustumaan siihen vasta ehkä nelikymppisenä ja opin edelleen joka viikko jotain uutta, osaan sitä luultavasti paremmin kuin keskiverto DBA. Kertoo enemmän keskiverto DBA:sta kuin minusta. 

Ranskaa olen oppinut täällä sen verran, että pärjään kohtuullisesti kaupassa ja ravintolassa. Ja ranskalaisten työkaverien keskinäisestä molotuksesta ymmärrän myöskin joka viikko vähän enemmän.

trending_up +2
8.3.2024 - 20:12

varatonnit

+241
Liittynyt:
8.7.2021
Viestejä:
171

hauturi wrote:

varatonnit wrote:

Seuraava toimii myös: SELECT DISTINCT ON (tunniste) tunniste, pvm, kurssi FROM kurssit order by tunniste, pvm DESC

Ei toimi ainakaan MariaDB:ssä (MySQL:ssä) - vaikka jättää tuon ON pois, mikä ei ole MariaDB:n syntaksin mukainen. Tulee kaikkien päivien kurssit

Joo, ei pitäisikään toimia MariaDB:ssä, kun DISTINCT ON kyselyä ei ole siinä toteutettu. Tuo toimii postgresql:ssä (testasin!), jossa on erikseen sekä DISTINCT että DISTINCT ON kyselyt. DISTINCT ottaa huomioon kaikki kyselyn palauttavat kentät, jolloin kaikki rivit palautetaan, koska mikään rivi ei ole toisteinen eriävien kurssien ja päivämäärien takia. DISTINCT ON (fieldName1, fieldName2, ...) ottaa huomioon vain sulkeissa annetut kentät toisteisuutta katsoessa, jolloin kysely postgresissa palauttaa vain yhden rivin per tunniste.

trending_up +1
8.3.2024 - 20:31

varatonnit

+241
Liittynyt:
8.7.2021
Viestejä:
171

Lisäyksenä vielä, ettei tullut mielenkään alun perin itselle viime vuosina lähinnä postgresiä käyttäneenä, ettei distinct on -komentoa ole kaikissa SQL-varianteissa. Aina oppii uutta.

trending_up +1
8.3.2024 - 21:22

Basso Pasanen

+155
Liittynyt:
4.7.2021
Viestejä:
135

Kannattaa hieman olla varovainen tai ainakin tarkka AI:n käytössä. Nämä yksinkertaiset kyselyt varmaan ok generoi mutta kompleksisuus kun lisääntyy niin isolla varauksella oikein toimivuus. Joku perus chatgpt ainakin tukehtuu vielä. En tiedä sitten miten jotkut maksulliset dedikoidut "palvelut" homman sorttaa.

trending_up +1
8.3.2024 - 22:06

Artsipappa

+2172
Liittynyt:
14.7.2016
Viestejä:
1970

Basso Pasanen wrote:

Kannattaa hieman olla varovainen tai ainakin tarkka AI:n käytössä. Nämä yksinkertaiset kyselyt varmaan ok generoi mutta kompleksisuus kun lisääntyy niin isolla varauksella oikein toimivuus. Joku perus chatgpt ainakin tukehtuu vielä. En tiedä sitten miten jotkut maksulliset dedikoidut "palvelut" homman sorttaa.

Tietenkin koodia testataan ja tuplatarkistetaan. Mutta nopeuttaa aivan älyttömästi. 

trending_up +1
9.3.2024 - 00:18

Basso Pasanen

+155
Liittynyt:
4.7.2021
Viestejä:
135

Hauturille sql opiskeluun, ota haltuun vaikka window funkkarit. Aika näppärää laskentaa helposti.

Esim. kolmen päivän 'moving average':

SELECT
   date,
   price,
   AVG(price) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average
FROM
   VoittajaOsakkeet;

trending_up +2
9.3.2024 - 09:27

hauturi

OP
+3264
Liittynyt:
25.6.2014
Viestejä:
2384

Kiitos vinkistä. Lähes aina kun on joku ongelma SQL:n kanssa, sen voi kiertää tekemällä yksinkertaisemman kyselyn ja vähän laskentaa koodissa, tai pari eri kyselyä (niin myös alkuperäisen ongelmani tai vaikkapa liukuvan keskiarvon kanssa). Nuorempana tuli lähes aina tehtyä näin, nykyään pyrin - ehkä enimmäkseen juurikin oppimismielessä - ratkomaan ongelmat SQL:n keinoin. Eihän se aina ole paras ratkaisu, joskus tulee turhankin monimutkaisia lauseita, mutta kun en ole n. 30 vuoteen koodannut enää työkseni vaan huvikseni, niin ratkaisujen ei tarvitse välttämättä olla optimaalisia sen enempää suorituskyvyn kuin ylläpidettävyydenkään osalta.

trending_up +2