Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: SQL Nroiden määrä, MAX ID joka läpäisty

jaska jokunen [28.11.2013 16:16:59]

#

Hei,
Etsin SQL lausetta seuraavalle:

Laskettava KilpuriNroiden määrä, jotka ovat kilpailleet max 2 kertaa ja viimeinen kilpailu on läpäisty?

SELECT KilpuriNro, COUNT(ID), Tulos
FROM Tulokset
GROUP BY KilpuriNro....

Ääh, jotain tuohon?

Grez [28.11.2013 16:33:23]

#

Tuo max 2 kertaa kilpaileminen on triviaali

SELECT KilpuriNro, COUNT(ID)
FROM Tulokset
GROUP BY KilpuriNro
HAVING COUNT(ID)<3

Tuo toinen, että viimeinen kilpailu on läpäisty on hieman hankalampi. Kysymyksenasettelusta ei edes tiedä mistä tietää onko kilpailu läpäisty vai ei. Tulos sarakkeessa lienee on jotain, mutta mitä.

Suoran vastauksen antamiseen auttaisi myös jos tietäisi mikä kanta kyseessä.

Metabolix [28.11.2013 17:17:57]

#

Yksi ratkaisu on tällainen:

SELECT t1.KilpuriNro, t2.Tulos AS VanhaTulos
FROM Tulokset AS t1
LEFT JOIN Tulokset AS t2
  ON t2.KilpuriNro = t1.KilpuriNro AND t2.ID < t1.ID
LEFT JOIN Tulokset AS t3
  ON t3.KilpuriNro = t1.KilpuriNro AND t3.ID NOT IN (t1.ID, t2.ID)
WHERE t1.Tulos = "läpi" AND t3.ID IS NULL

Miksi tämä kysely toimii? WHERE-kohdan mukaan t1 sisältää varmasti läpäistyn kilpailun ja t3 ei sisällä mitään, ja ensimmäisen liitoksen mukaan t2 sisältää kilpailun, joka on ennen t1:tä. Jos tuloksia on enemmän kuin kaksi, t3 sisältää myös jonkin tuloksen ja ehto ei toteudu. Samoin jos t1 ei ole uusin tulos, t3 sisältää uusimman tuloksen ja ehto ei toteudu.

Kyselyssä oletetaan, että ID on oikea tapa vertailla järjestystä. Jos taulussa on erikseen aikaleima, ensimmäisessä liitoksessa kuuluu käyttää sitä.

jaska jokunen [29.11.2013 08:26:38]

#

Kiitos kommenteista! Vähän tarkennusta, kun kieltämättä vähän epäselvästi olin laittanut. Tuloskertoja voi olla yli kolmekin, vaikka 6. Tulosrivillä tarviisin tuon count(id).. Suurin id on uusin tulos. Tulos on kannassa läpi tai eiläpi. Koodilla .net tai php ottaisin sql:stä tuloksen, eli jos juoksukertoja oli max 2 ja tulos tällä tokalla kiekalla oli nimenomaan läpi.

Metabolix [29.11.2013 15:01:42]

#

Luitkohan viestiäni, tai kokeilitko koodiani?

Et ilmeisesti ole ajatellut asiaa loppuun asti. Uusimman juoksun tulos on turha hakea, koska jo ehto määrää, että se on läpi. COUNT(ID) on turha hakea, koska se on aina 1 tai 2 ja sen voi päätellä siitä, onko edellisen juoksun tulos NULL (ei tulosta, vain 1 juoksu) vai jokin muu (on tulos, 2 juoksua).

Jos olet sitä mieltä, että kyselyni ei tuota tyydyttävää tulosta, et ole vieläkään onnistunut selittämään tilannettasi tarpeeksi hyvin.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta