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í
×
    5.6. 22:22 | Nová verze

    Byla vydána nová verze 9.7 multiplatformní digitální pracovní stanice pro práci s audiem (DAW) Ardour. Přehled novinek, vylepšení a oprav v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    5.6. 18:22 | Komunita

    Vývojáři webového prohlížeče Ladybird dnes oznámili, že mění způsob vývoje. S blížícím se vydáním alfa verze přestávají přijímat veřejné pull requesty. Všechny otevřené veřejné pull requesty budou uzavřeny. Tým nedokáže garantovat bezpečnost AI generovaných pull requestů.

    Ladislav Hagara | Komentářů: 2
    5.6. 17:33 | Zajímavý software

    OpenLogi (GitHub) je open source náhrada aplikace Logi Options+ pro přizpůsobení myší od společnosti Logitech. Zatím běží pouze na macOS.

    Ladislav Hagara | Komentářů: 1
    5.6. 04:33 | Nová verze

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za květen (YouTube).

    Ladislav Hagara | Komentářů: 9
    4.6. 11:22 | Bezpečnostní upozornění

    Úřad pro ochranu osobních údajů řeší desítky stížností na jednotné měsíční hlášení zaměstnavatele, které stát spustil počátkem dubna. Systém, jenž má firmám odlehčit od desítek formulářů, nejenže výrazně zatížil jejich účetní oddělení, ale docházelo v něm i k únikům osobních dat zaměstnanců k firmám, kde nepracovali. Podle ministerstva práce a sociálních věcí stála za problémem technická chyba. „Incident se týkal několika stovek

    … více »
    Ladislav Hagara | Komentářů: 22
    4.6. 10:46 | Nová verze

    Byla vydána (𝕏, Bluesky) nová verze 22.0.0 open source webového aplikačního frameworku Angular (Wikipedie). Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    4.6. 04:33 | Nová verze

    Vim Classic byl vydán ve verzi 8.3. Drew DeVault oznámil tento fork editoru Vim (verze 8.2.0148, tj. těsně před zavedením Vim9 skriptování) v březnu letošního roku. Důvodem forku bylo, že vývojáři editorů Vim a Neovim začali při vývoji využívat LLM.

    Ladislav Hagara | Komentářů: 7
    4.6. 03:44 | Komunita

    Open source konference DevConf.CZ 2026 proběhne 18. a 19. června v Brně na FIT VUT. Publikován byl program a spuštěna byla registrace.

    Ladislav Hagara | Komentářů: 0
    3.6. 19:44 | Nová verze

    Společnost JetBrains uvolnila verzi 2 svého open-source velkého jazykového modelu (LLM) pro vývojáře Mellum.

    Ladislav Hagara | Komentářů: 0
    3.6. 14:44 | IT novinky

    Probíhá konference Microsoft Build 2026. Microsoft představuje své novinky: kvantový čip Majorana 2, Surface Laptop Ultra a Surface RTX Spark Dev Box s NVIDIA RTX Spark, Intelligent Terminal, Coreutils for Windows (fork Rust Coreutils), AI modely MAI, AI agenta Scout, platformu pro agent-first zařízení Project Solara, …

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (12%)
     (8%)
     (2%)
     (15%)
     (31%)
     (3%)
     (6%)
     (3%)
     (15%)
     (26%)
    Celkem 1843 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: SQL dotaz, groupování

    24.7.2017 20:54 Franta
    SQL dotaz, groupování
    Přečteno: 1431×
    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.