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.


Zobrazeno 8 zpráv z 8.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.