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í
×
včera 16:55 | Komunita

Handshake, decentralizovaná certifikační autorita a peer-to-peer DNS aneb DNS v blockchainu, postupně rozděluje mezi svobodné a open source projekty celkově 10,2 milionu dolarů. V srpnu získalo 300 000 dolarů GNOME a 100 000 dolarů GIMP. Dnes oznámila nezisková organizace KDE e.V. zastupující komunitu kolem KDE v právních a finančních záležitostech, že od Handshake získala 300 000 dolarů, z čehož 100 000 dolarů je alokováno pro multiplatformní balík svobodných kancelářských a grafických aplikací Calligra.

Ladislav Hagara | Komentářů: 3
12.10. 15:44 | Nová verze

Po třech letech od vydání verze 5.0 byla vydána nová major verze 6.0 v Javě napsané aplikace pro komplexní návrh rozmístění nábytku a dalšího vybavení v interiérech Sweet Home 3D. Přináší celou řadu novinek. Zdůraznit lze možnost otevírání oken, dveří nebo skříněk. Zmínit lze také novou figurínu s otočnými klouby.

Ladislav Hagara | Komentářů: 20
12.10. 15:00 | Nová verze

Byla vydána nová verze 2018-10-09 linuxové distribuce Raspbian určené především pro jednodeskové miniaturní počítače Raspberry Pi. Přehled novinek v poznámkách k vydání. Společně s Raspbianem byl aktualizován také instalační nástroj NOOBS (New Out Of the Box Software). Z novinek je nutno upozornit na odstranění programu Wolfram Mathematica.

Ladislav Hagara | Komentářů: 2
11.10. 22:44 | Zajímavý projekt

V rámci projektu PRIM (Podpora rozvíjení informatického myšlení), jehož cílem je "podporovat změnu orientace školského předmětu informatika z uživatelského ovládání ICT směrem k základům informatiky jako oboru", byly na stránkách iMyšlení (informatické myšlení) představeny volně stažitelné učebnice a výukové materiály pro výuku informatiky. Videozáznam z tiskové konference na Facebooku.

Ladislav Hagara | Komentářů: 2
11.10. 13:22 | Nová verze

Nadace Free Software Foundation (FSF) zveřejnila na svých stránkách prohlášení k připojení Microsoftu k Open Invention Network (OIN): Je to krok správným směrem. Problematiku softwarových patentů to ale neřeší. OIN pokrývá pouze část svobodného softwaru. Smlouvu s OIN lze vypovědět s 30 denní lhůtou. FSF vyzývá Microsoft, aby 1) jednoznačně potvrdil, že ukončil všechny patentové spory související s Linuxem v Androidu, 2) s členy OIN

… více »
Ladislav Hagara | Komentářů: 2
10.10. 22:22 | Komunita

Bradley M. Kuhn se v příspěvku na blogu Software Freedom Conservancy zamýšlí nad připojením Microsoftu k Open Invention Network. Žádá Microsoft, aby jako gesto dobré vůle a jako důkaz, že to myslí opravdu vážně, sám commitnul zdrojové kódy proprietárního patentovaného souborového systému exFAT pod licencí GPLv2+ do upstreamu Linuxu.

Ladislav Hagara | Komentářů: 32
10.10. 18:11 | Komunita

Microsoft se připojil k organizaci Open Invention Network, zkráceně OIN, založené v roce 2005 za účelem vytvoření a správy portfolia patentů, jeho sdílení a použití v patentových sporech k ochraně Linuxu a open source softwaru. Portfolio patentů se tím rozšířilo o více než 60 000 patentů.

Ladislav Hagara | Komentářů: 8
10.10. 15:25 | Zajímavý článek

Vědci z Národního ústavu duševního zdraví (NÚDZ) v Klecanech experimentálně zjistili (publikace v BioMed Research International), že používání GPS navigace v chytrých brýlích mění strukturu mozku. U testované skupiny došlo už po třech měsících ke snížení počtu spojení mezi hipokampem a ostatními částmi mozku.

Blaazen | Komentářů: 13
10.10. 08:55 | Komunita

Diskusi vyvolala stránka Flatpak - bezpečnostní noční můra (flatkill.org) popisující bezpečnostní problémy technologie Flatpak [reddit, Hacker News].

Ladislav Hagara | Komentářů: 76
9.10. 23:55 | Nová verze

V Orlandu probíhá konference AstriCon 2018 věnovaná Asterisku (Wikipedie), tj. svobodné softwarové implementaci telefonní ústředny (PBX). Při té příležitosti byla vydána nová verze 16 Asterisku a nová verze 15 webového rozhraní k Asterisku FreePBX. Dění na konferenci lze sledovat na Twitteru.

Ladislav Hagara | Komentářů: 0
Přispíváte osobně k vývoji svobodného softwaru?
 (40%)
 (41%)
 (23%)
 (22%)
 (10%)
 (37%)
Celkem 206 hlasů
 Komentářů: 7, poslední včera 22:28
Rozcestník

Dotaz: SQL dotaz, groupování

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