abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 15:44 | Nová verze

    Byl vydán Mozilla Firefox 126.0. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Vylepšena byla funkce "Zkopírovat odkaz bez sledovacích prvků". Přidána byla podpora zstd (Zstandard). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 126 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    dnes 15:22 | Nová verze

    Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 11.0. Přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    dnes 14:55 | Nová verze

    Byla vydána nová verze 24.0 linuxové distribuce Manjaro (Wikipedie). Její kódové jméno je Wynsdey. Ke stažení je v edicích GNOME, KDE PLASMA a XFCE.

    Ladislav Hagara | Komentářů: 2
    dnes 13:00 | Nová verze

    Byla představena oficiální rozšiřující deska Raspberry Pi M.2 HAT+ pro připojování M.2 periferii jako jsou NVMe disky a AI akcelerátory k Raspberry Pi 5. Cena je 12 dolarů.

    Ladislav Hagara | Komentářů: 1
    dnes 12:44 | Pozvánky

    V Praze o víkendu proběhla bastlířská událost roku - výstava Maker Fair v Praze. I strahovští bastlíři nelenili a bastly ostatních prozkoumali. Přijďte si proto i vy na Virtuální Bastlírnu popovídat, co Vás nejvíce zaujalo a jaké projekty jste si přinesli! Samozřejmě, nejen českou bastlířskou scénou je člověk živ - takže co se stalo ve světě a o čem mohou strahováci něco říct? Smutnou zprávou může být to, že provozovatel Sigfoxu jde do

    … více »
    bkralik | Komentářů: 0
    dnes 12:33 | Humor

    Kam asi vede IllllIllIIl.llIlI.lI? Zkracovač URL llIlI.lI.

    Ladislav Hagara | Komentářů: 1
    včera 22:00 | IT novinky

    Společnost OpenAI představila svůj nejnovější AI model GPT-4o (o jako omni, tj. vše). Nově také "vidí" a "slyší". Videoukázky na 𝕏 nebo YouTube.

    Ladislav Hagara | Komentářů: 0
    včera 15:44 | Zajímavý článek

    Ondřej Filip publikoval reportáž z ceremonie podpisu kořenové zóny DNS. Zhlédnout lze také jeho nedávnou přednášku Jak se podepisuje kořenová zóna Internetu v rámci cyklu Fyzikální čtvrtky FEL ČVUT.

    Ladislav Hagara | Komentářů: 0
    včera 14:22 | IT novinky

    Společnost BenQ uvádí na trh novou řadu monitorů RD určenou pro programátory. První z nich je RD240Q.

    Ladislav Hagara | Komentářů: 19
    včera 13:00 | IT novinky

    Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem nadále zůstává Frontier od HPE (Cray) s výkonem 1,206 exaFLOPS. Druhá Aurora má oproti loňsku přibližně dvojnásobný počet jader a dvojnásobný výkon: 1,012 exaFLOPS. Novým počítačem v první desítce je na 6. místě Alps. Novým českým počítačem v TOP500 je na 112. místě C24 ve Škoda Auto v Mladé Boleslavi. Ostravská Karolina, GPU

    … více »
    Ladislav Hagara | Komentářů: 0
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (72%)
     (6%)
     (11%)
     (11%)
    Celkem 245 hlasů
     Komentářů: 16, poslední dnes 11:05
    Rozcestník

    Dotaz: SQL dotaz, groupování

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