Diskuze: vnorený SELECT s DISTINCT-om
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 8 zpráv z 8.
//= 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.
Když za to tvé "lehké" přidáš GROUP BY uzivatel ORDER BY datum, měl
bys dostat po čem toužíš...
např.
SELECT * FROM tabulka WHERE cislo = @cislo GROUP BY uzivatel ORDER BY datum
Dík, ale to nepôjde
"Column 'tabulka.id' is invalid in the select list because it is not contained
in either an aggregate function or the GROUP BY clause."
Ja som skúšal spraviť si iba zoznam userov bez duplicít, ktorí mali dané číslo
SELECT DISTINCT uzivatel FROM tabulka WHERE cislo = @cislo ORDER BY uzivatel
a potom druhú tabuľku, kde sa vyberie iba prvý záznam usera s predch.tabuľky a daným číslom. Toto spraviť nejakým vnoreným SELECTom.. nieje to moc zrozumiteľné, ale asi vieš o čo ide aký chcem výsledok.
Logicky slovo "tabulka" musíš nahradit názvem své tabulky...
to je jasné, až taký
začiatočník nie som. MS-SQL to skrátka nechce takto zoskupovať.
Tak si přečti tu chybu a jednoduše místo hvězdičky tam ty sloupce vypiš...
Pokud ti stačí jen uživatel a datum, dá se použít agregační funkce MIN:
SELECT uzivatel, MIN(datum) AS prvni_login FROM tabulka WHERE cislo = @cislo GROUP BY uzivatel ORDER BY uzivatel
Pokud bys potřeboval celý záznam i s id, pak už na to funkce MIN nestačí, protože vrací jen nejmenší hodnotu v daném sloupci, ale už ne id příslušného záznamu. Ale šlo by to takhle:
SELECT Tvnejsi.*
FROM tabulka Tvnejsi
OUTER APPLY
(
SELECT TOP 1 Tvnitrni.id FROM tabulka Tvnitrni WHERE Tvnitrni.uzivatel = Tvnejsi.uzivatel AND Tvnitrni.cislo = @cislo ORDER BY Tvnitrni.datum
) AS Pomoc
WHERE Tvnejsi.id = Pomoc.id
ORDER BY Tvnejsi.uzivatel
Princip v tom druhém případě je takový, že ke každému záznamu tabulky nejdřív připojíš id odpovídající správnému datumu. To se dělá pomocí toho OUTER APPLY. Konstrukce OUTER APPLY je vlastně totéž jako JOIN, akorát ti umožňuje odvolávat se uvnitř na vnější tabulku. Uvnitř outer apply zavoláš vlastní logiku - že číslo musí být @cislo a že pro daného uživatele tě zajímá jen první záznam podle data. Zároveň uvnitř musí být vazba Tvnitrni.uzivatel = Tvnejsi.uzivatel, abys uvnitř prohledával záznamy jen pro správného uživatele. A když už máš k vnější tabulce připojená správná id, už jen řekneš, že ostatní záznamy tě nezajímají (to je to WHERE Tvnejsi.id = Pomoc.id).
Pro lepší názornost jsem připojil obrázek, kde ukazuju i mezivýsledek. Ten pátý sloupec v mezivýsledku jsou právě ta správná id připojená ke všem záznamům původní tabulky. Toho zavináče v @tabulka si nevšímej, to je jen moje deklarovaná tabulka, pomocí které emuluju tu tvoji.
Páni dík za odpovede a Jakub Švasta za super vysvetlenie. Presne takúto nejakú konštrukciu som hľadal a na základe nej môžem poriešiť daľšie dotazy ktoré potrebujem. Ešte raz veľké DÍK.
Zobrazeno 8 zpráv z 8.