Diskuze: Dotaz na nejlepší výkon v tabulce sportovních výkonů
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 39 zpráv z 39.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
a co takhle?
SELECT jmeno + ' ' + prijmeni as clovek, cas, rocnik, kategorie, oddil, pohlavi FROM table ORDER BY cas GROUP BY clovek
Jednak špatný syntax - GROUP BY musí být pře ORDER BY a navíc je to
nesmysl!
MIN(cas) tam mas, co treba
MAX(rocnik)?
Jinak pouziva data z prvniho nalezeneho radku.
Nechci vrátit maximální ročník? Co by to mělo za smysl?! Chci vědět, kdy ten týpek
zaběhl nejlepší čas a v kterém to bylo roce!
To je to, oč tu běží!
Když vynecháš to groupování a dáš tam jen řazení podle časů, tak se ti to srovná správně?
SELECT * FROM table ORDER BY cas
Pak ti ten dotaz co jsem psal (napsaný ve správném tvaru) musí vrátit výsledek správný
SELECT jmeno + ' ' + prijmeni as clovek, cas, rocnik FROM table GROUP BY clovek ORDER BY cas
Nikoliv.
Vrátí jeden záznam a navíc zcela prázdný pole 'clovek'!
V tom případě se minimálně jeden z těch sloupců jmenuje jinak, nebo do dotazu dáváš jiný znak místo té '
Proč tam pořád všichni cpete to grupování?
Předpokládal bych že hledáte něco jako:
SELECT DISTINCT jmeno + ' ' + prijmeni as clovek, cas, rocnik FROM table ORDER BY cas
Výsledek DISTINCT a GROUP BY je v tomto případě stejný. Otázka je, co by tu distinct udělal, kdyby byly dva stejné časy...
a nemyslíš tohle náhodou?
SELECT CONCAT(jmeno, " ", prijmeni) AS clovek
Ne, myslel jsem přesně to, co jsem napsal, jen musíš napsat jednoduché uvozovky a nikoliv apostrof, nebo obrácené uvozovky
Vyzkoušel jsem tyto varianty:
SELECT jmeno + ' ' + prijmeni as clovek, cas, rocnik FROM table GROUP BY clovek ORDER BY cas
SELECT jmeno + " " + prijmeni as clovek, cas, rocnik FROM table GROUP BY clovek ORDER BY cas
SELECT (jmeno + prijmeni) as clovek, cas, rocnik FROM table GROUP BY clovek ORDER BY cas
A vše mi vrátí stejný výsledek! => jeden záznam a navíc zcela prázdný pole 'clovek'!
Hoď sem screenShot co ti to vypíše, když zadáš
SELECT * FROM table
David Alžběta 11:22 2012 Muži A Lukov Oil M
David Alžběta 10:22 2014 Muži A Lukov Oil M
Radek Lavina 13:20 2015 Muži B Kolov M
Radek Lavina 15:20 2018 Muži B Kolov M
A toto (když vyhodíme sloučení sloupců) ti vrátí co?
SELECT jmeno, prijmeni, cas, rocnik FROM table GROUP BY prijmeni ORDER BY cas
Ahoj,
nevím, o jako SQL jde, ale myslím si, že řešení je následující
select * from vysledkyTable
inner join (SELECT jmeno+ ' '+ prijmeni Clovek, Min(Cas) MinCas from vysledkyTable group by jmeno+ ' '+ prijmeni) as preData on vysledkyTable.Jmeno+' '+vysledkyTable.Prijmeni = Predata.Clovek and vysledkyTable.Cas = Predata.cas
order by vysledkyTable.cas
samozřejmě si název tabulky přepiš podle názvu své tabulky
Nepřijde ti to trošku jako, kdybys hledal vidle ve stodole tankem? Bohatě stačí na zobrazení výsledků to, co jsem psal...
Podle mě, to přesně odpovídá zadání. Chce unikátní osoby, nejlepší
čas osoby, rok kdy toho času dosáhl a další data z "nejlepšího" záznamu,
vždy 1 unikátní záznam osoby. Viz. dotaz a ukázkové tabulky.
Jako tank to rozhodně nevidím, tank by bylo použití kurzoru
A přesně na to stačí jednoduchý select. Přijde mi naprosto zbytečné, páchat takový složitý dotaz joinováním té samé tabulky, když to vyřeší jednoduchý distinct nebo group...
Jenže distinctem ani samotným group nedosáhneš požadovaného
výsledku.
Myslím si, že tady není potřeba se dohadovat... vyzkoušej si to... a
uvidíš … tabulka a i data jsou jednoduchý, přepis ti nepotrvá tak
dlouho...
Přesně to jsem udělal a vysledek byl dle očekávání...
Ok... tvůj poslední select vypíše 4 sloupce, požadováno je 7... Někde
je něco špatně...
Nehledě na to, že ten dotaz musí vyhodit chybu... jak SQL pozná, že chceš
minimální čas a ne maximální, to samé ročník, to má věšteckou
kouli?
Není to o počtu sloupců, jen se mi to nechtělo všechno vypisovat a na nejnižší čas stačí dát MIN(cas)
Ok, super, rád se nechávám houpat, pouťové atrakce mám rád, ale ty se
mnou houpeš až moc...
Co to křestní jméno a ten ročník, kdy dosáhl nejlepšího času? …
zajímalo by mě, co používáš za SQL DB...
Opravdu to nešlo jednoduchým selectem!
Máš to správně, děkuji!
Nechce se mi cist celou diskuzi nad tim. Asi i vyreseno. Ale stejne pripojim
tip reseni
Chces udaje o cloveku? Tak je pripoj?
A je to presne logicky postup, jakym bys postupoval i realnem zivote. Take by sis nechal vyhledat programem nejdriv zaznamy podle kriterii (seznam id) a pak by sis je rozklikaval a prohlizel.
SELECT
a.id, b.jmeno, b.rok
FROM
(SELECT id FROM table ... GROUP by ... ) a
LEFT JOIN table b ON b.id=a.id
ORDER BY ...
Pripadne s tim group tam muzes mit v select nejaku count nebo neco, co se da ziskat jen tim grupem.
A jak bys udělal tzv. ztrátu sloupeček, tj. TIME(cas - MIN(cas)) AS
ztrata?
Ke každému záznamu zobrazit ztrátu, kde ztráta časová je čas
závodníka mínus nejmenší čas v databázi!
Díky!
Cas by byl soucasti toho GROUP BY, jak psal don.jarducius 25. října 20:44.
select * from (
select jmeno, prijmeni, cas, rocnik, katergorie, oddil, pohlavi, cas - (select min(cas) from tabulka) as ztrata,
rank() over (partition by jmeno, prijmeni order by cas) as je_nejlepsi_cas
from tabulka) a
where a.je_nejlepsi_cas = 1;
select * from (
select jmeno, prijmeni, cas, rocnik, katergorie, oddil, pohlavi, cas - (select min(cas) from tabulka) as ztrata,
rank() over (partition by jmeno, prijmeni order by cas) as je_nejlepsi_cas
from tabulka) a
where a.je_nejlepsi_cas = 1;
SELECT p.jmeno AS jmeno, p.prijmeni AS prijmeni, t.cas AS cas, SEC_TO_TIME(ROUND(TIME_TO_SEC(p.cas)/3.9,0)) AS tempo, TIME_FORMAT(SEC_TO_TIME(( TIME_TO_SEC(cas) - (SELECT TIME_TO_SEC(Min(cas)) FROM prebornik) )), '%i:%s') AS ztrata, p.kategorie AS kategorie, p.oddil AS oddil, p.pohlavi AS pohlavi, p.rocnik AS rocnik FROM prebornik p INNER JOIN (SELECT prijmeni, jmeno, MIN(cas) AS cas FROM prebornik GROUP BY prijmeni, jmeno) t ON p.prijmeni = t.prijmeni AND p.jmeno = t.jmeno AND p.cas = t.cas ORDER BY t.cas ASC
MASAKR! Funguje
Zobrazeno 39 zpráv z 39.