abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 11:33 | Zajímavý článek Ladislav Hagara | Komentářů: 0
    včera 21:44 | Nová verze

    Byl vydán Mozilla Firefox 143.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Nově se Firefox při ukončování anonymního režimu zeptá, zda chcete smazat stažené soubory. Dialog pro povolení přístupu ke kameře zobrazuje náhled. Obzvláště užitečné při přepínání mezi více kamerami. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 143 bude brzy k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    včera 17:22 | Nová verze

    Byla vydána betaverze Fedora Linuxu 43 (ChangeSet), tj. poslední zastávka před vydáním finální verze, která je naplánována na úterý 21. října.

    Ladislav Hagara | Komentářů: 0
    včera 12:22 | Nová verze

    Multiplatformní emulátor terminálu Ghostty byl vydán ve verzi 1.2 (𝕏, Mastodon). Přehled novinek, vylepšení a nových efektů v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 00:11 | Nová verze

    Byla vydána nová verze 4.5 (𝕏, Bluesky, Mastodon) multiplatformního open source herního enginu Godot (Wikipedie, GitHub). Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    15.9. 21:33 | Nová verze

    Byla vydána verze 3.0 (Mastodon) nástroje pro záznam a sdílení terminálových sezení asciinema (GitHub). S novou verzí formátu záznamu asciicast v3, podporou live streamingu a především kompletním přepisem z Pythonu do Rustu.

    Ladislav Hagara | Komentářů: 0
    15.9. 21:00 | Komunita

    Canonical oznámil, že bude podporovat a distribuovat toolkit NVIDIA CUDA (Wikipedie) v Ubuntu.

    Ladislav Hagara | Komentářů: 0
    15.9. 20:44 | IT novinky

    Tržní hodnota americké společnosti Alphabet, která je majitelem internetového vyhledávače Google, dnes poprvé překonala hranici tří bilionů dolarů (62,1 bilionu Kč). Alphabet se připojil k malé skupině společností, které tuto hranici pokořily. Jsou mezi nimi zatím americké firmy Nvidia, Microsoft a Apple.

    Ladislav Hagara | Komentářů: 2
    15.9. 20:33 | IT novinky

    Spojené státy a Čína dosáhly dohody ohledně pokračování populární čínské platformy pro sdílení krátkých videí TikTok v USA. V příspěvku na síti Truth Social to dnes naznačil americký prezident Donald Trump. Dosažení rámcové dohody o TikToku vzápětí oznámil americký ministr financí Scott Bessent, který v Madridu jedná s čínskými představiteli o vzájemných obchodních vztazích mezi USA a Čínou. Bessentova slova později potvrdila také čínská strana.

    Ladislav Hagara | Komentářů: 0
    15.9. 16:55 | Komunita

    MKVToolNix, tj. sada nástrojů pro práci s formátem (medialnym kontajnerom) Matroska, byl vydán ve verzi 95.0. Podpora přehrávání formátu Matroska míří do Firefoxu [Bug 1422891, Technický popis]. Přehrávání lze již testovat ve Firefoxu Nightly.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (75%)
     (100%)
     (0%)
     (0%)
     (0%)
     (25%)
     (50%)
     (0%)
     (25%)
    Celkem 4 hlasů
     Komentářů: 1, poslední dnes 13:49
    Rozcestník

    Dotaz: SQL dotaz, groupování

    24.7.2017 20:54 Franta
    SQL dotaz, groupování
    Přečteno: 1387×
    Mám sqlite databázi a následující tabulku, nazvěme ji tbl:
    |- id1 -|- id2 -|- min -|- max -|- pos -|-- set ---|
    |   0   |   0   |  10   |  20   |   0   |    0     |
    |   0   |   0   |   5   |  10   |   1   |    0     | Group1
    |--------------------------------------------------|
    |   0   |   0   |  15   |  25   |   0   |    1     | Group 2
    |--------------------------------------------------|
    |   0   |   0   |   5   |  15   |   0   |    2     | Group 3
    |-------|-------|-------|-------|-------|----------|
    |   0   |   1   |   5   |  10   |   0   |    0     |
    |   0   |   1   |   6   |  10   |   1   |    0     | Group4
    |-------|-------|-------|-------|-------|----------|
    |   1   |   0   |   5   |  10   |   0   |    0     |
    |   1   |   0   |   5   |  15   |   1   |    0     | Group5
    |   1   |   0   |  10   |  20   |   2   |    0     |
    
    Každá unikátní kombinace set, id1, id2 by měla představovat jednu skupinu.

    Ze skupiny potřebuji vybrat řádek, který má největší rozdíl min - max, zároveň nejmenší hodnotu pos.

    Nějak jsem napsal poddotaz. Píšu to teď z hlavy a asi to nebude funkční, něco takového:
    SELECT *
    FROM `tbl`
    `A`
    INNER JOIN
    ( SELECT `id1`, `id2`, `set`, MAX(`max` - `min`) as `delta`
      FROM `tbl`
      GROUP BY `id1`, `id2`, `set`
    ) `B`
    ON `A.id1` = `B.id1` AND `A.id2` = `B.id2` AND `A.set` = `B.set` AND (`A.max` - `A.min`) = `B.delta`
    
    Tento dotaz mi správně vrátí záznamy z každé skupiny s nejvyšším rozdílem max, min, tj:
    |- id1 -|- id2 -|- min -|- max -|- pos -|-- set ---|
    |   0   |   0   |  10   |  20   |   0   |    0     |
    |   0   |   0   |   5   |  10   |   1   |    0     | Group1
    |--------------------------------------------------|
    |   0   |   0   |  15   |  25   |   0   |    1     | Group 2
    |--------------------------------------------------|
    |   0   |   0   |   5   |  15   |   0   |    2     | Group 3
    |-------|-------|-------|-------|-------|----------|
    |   0   |   1   |   5   |  10   |   0   |    0     | Group4
    |-------|-------|-------|-------|-------|----------|
    |   1   |   0   |   5   |  15   |   1   |    0     | Group5
    |   1   |   0   |  10   |  20   |   2   |    0     |
    
    Z tohoto výsledku ještě potřebuji dostat řádky s nejnižší hodnotou pos v dané skupině. Tj. chci záznamy:
    |- id1 -|- id2 -|- min -|- max -|- pos -|-- set ---|
    |   0   |   0   |  10   |  20   |   0   |    0     | Group1
    |--------------------------------------------------|
    |   0   |   0   |  15   |  25   |   0   |    1     | Group 2
    |--------------------------------------------------|
    |   0   |   0   |   5   |  15   |   0   |    2     | Group 3
    |-------|-------|-------|-------|-------|----------|
    |   0   |   1   |   5   |  10   |   0   |    0     | Group4
    |-------|-------|-------|-------|-------|----------|
    |   1   |   0   |   5   |  15   |   1   |    0     | Group5
    
    Napadlo mě zduplikovat poddotaz, na jeden udělat poddotaz s agregační funkci MIN(pos) a provést další inner join na původní poddotaz na id1, id2, pos, ale nějak se mi to nezdá, nejde to udělat lépe?

    Odpovědi

    24.7.2017 20:57 Franta
    Rozbalit Rozbalit vše Re: SQL dotaz, groupování
    Tak dlouho jsem to upravoval, až je to špatně. Druhá tabulka po groupování má správně být
    |- id1 -|- id2 -|- min -|- max -|- pos -|-- set ---|
    |   0   |   0   |  10   |  20   |   0   |    0     | Group1
    |--------------------------------------------------|
    |   0   |   0   |  15   |  25   |   0   |    1     | Group 2
    |--------------------------------------------------|
    |   0   |   0   |   5   |  15   |   0   |    2     | Group 3
    |-------|-------|-------|-------|-------|----------|
    |   0   |   1   |   5   |  10   |   0   |    0     | Group4
    |-------|-------|-------|-------|-------|----------|
    |   1   |   0   |   5   |  15   |   1   |    0     | Group5
    |   1   |   0   |  10   |  20   |   2   |    0     |
    
    24.7.2017 22:09 K
    Rozbalit Rozbalit vše Re: SQL dotaz, groupování
    Ono to moc elegantně udělat nejde. Bohužel sqlite neumí window funkce, se kterými je to udělat hračka.

    Aby byl zápis jednodušší, tak si ještě můžes pomocí with - takhle nějak by to asi mohlo jít:
    with grupovane as (
    SELECT A.id1. A.id2, A.set, A.min, A.max, A.set
    FROM `tbl`
    `A`
    INNER JOIN
    ( SELECT `id1`, `id2`, `set`, MAX(`max` - `min`) as `delta`
      FROM `tbl`
      GROUP BY `id1`, `id2`, `set`
    ) `B`
    ON `A.id1` = `B.id1` AND `A.id2` = `B.id2` AND `A.set` = `B.set` AND (`A.max` - `A.min`) = `B.delta`
    (
    select * from grupovane C
    inner join
    (select id1, id2, set, min(pos) as minpos 
    from grupovane group bz id1, id2, set) d on C.id1 = D.id1 and `C.id2` = `D.id2` AND `C.set` = `D.set`
                  and C.pos = D.minpos
    
    takhle ale připojíš původní tabulku 4x. Navíc pokud budou nějaké záznamy, kde bude stejný rozdíl a stejný pos, tak ti to pro skupinu vrátí dva záznamy.

    Možná by to šlo řešit celkem elegantně aplikačně.
    select * from tbl order by id1, id2, set, max - min desc, pos
    
    a pak pro kombinaci id1, id2, set vzít vždy jen první řádek (pamatovat si hodnoty z minulého fetche a pokud se id1, id2 nebo set změní, tak je to řádek, co mě zajímá.

    25.7.2017 09:18 kaaja | skóre: 24 | blog: Sem tam něco | Podbořany, Praha
    Rozbalit Rozbalit vše Re: SQL dotaz, groupování
    Napadá mě takový workaround přístup. Potřebuješ vlastně najít řádek, pro který neexistuje žádný se stejnou kombinací id1, id2 a set, který má větší rozdíl v min a max, ale menší pos
    select * from tbl a 
    where not exists (
      select 0 from tbl b
       where a.id1 = b.id1 and a.id2 = b.id2 and a.set = b.set 
        and a.max - a.min < b.max - b.min and a.set > b.set
        and a.max <> b.max and a.min <> b.min
    )
    
    ale počítá to s tím, že neexistují úplně duplicitní řádky - ty to nevyselectí.
    Josef Kufner avatar 25.7.2017 11:41 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: SQL dotaz, groupování
    Můžeš to zkusit přepsat pomocí joinu (bez subselectu). Můžeš zkusit otočit ten join, který tam máš. Možná by to vyšlo trochu elegantněji. Ale v zásadě ten select se subselectem máš správně a o moc lépe to nejde.

    Pokud chceš ještě přidat podmínku na co nejmenší pos, tedy aby při stejném MAX(max-min) se vybralo menší pos, tak zkus rozdíl max-min a pos sloučit do jedné hodnoty a tím říct přesné pořadí – něco jako MAX((max - min) + (1 - pos/(SELECT MAX(pos) FROM tbl))) (předpokládám jen celočíselné sloupce). Pro lepší výkon by se mohlo hodit tuhle hodnotu předpočítávat do pomocného sloupečku a dát nad to index.
    Hello world ! Segmentation fault (core dumped)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.