SQL JOIN priradene stlpca podla ID

SQL JOIN priradene stlpca podla ID
« kdy: 11. 11. 2020, 12:15:51 »
O co mi ide.
Mam 2 tabulky v jednej je start_time stop_time a reason. V druhej mam reason_id, nazov.
Riesim ako pomocov select a join vybrat a spocitat cas medzi stop a start tak aby som nezobrazoval reason_id ale rovno nazov.
V prvom kroku chcem vyselectovat den. to je easy
Kód: [Vybrat]
SELECT * From main_table WHERE machine_id = 'xyz' and start_time between $MyS and $MyEkde $MyS je proste len cas od do.
V druhom kroku som pripojil druhu tabulku kde je pekne zobrazene vsetko
Kód: [Vybrat]
SELECT * From main_table LEFT JOIN dbo.DT_Reasons ON dt_reason = reason_idx WHERE machine_id = 'xyz' and start_time between $MyS and $MyE Ako v mssql doriesim to aby mi v ramci tohoto selectu spocital kolko casu preslo v den ked potrebujem aj ked reason_idx bude 10x v roznom case? Zvladne to SQL alebo to mam riesit rovno v PHP?



Re:SQL JOIN priradene stlpca podla ID
« Odpověď #1 kdy: 11. 11. 2020, 12:22:33 »
Resp inak. Rozdiel v case viem doriesit.
Kód: [Vybrat]
SELECT start_time, reason_name ,DATEDIFF(SECOND,start_time, stop_time) From main_table LEFT JOIN dbo.DT_Reasons ON dt_reason = reason_idx WHERE machine_id = 'xyz' and start_time between $MyS and $MyEale ako spocitat total_time ak sa mi pricina opakuje 5x ale nie po sebe?

Re:SQL JOIN priradene stlpca podla ID
« Odpověď #2 kdy: 11. 11. 2020, 12:53:21 »
resp. este inak ako spocitat total_time ak sa mi pricina opakuje v jeden den 5x a chcem vediet kazdy den v tom rozsahu kolko sa dokopy stalo na danu pricinu

Re:SQL JOIN priradene stlpca podla ID
« Odpověď #3 kdy: 11. 11. 2020, 13:13:36 »
Nepoužívám mysql, protože má dost omezené možnosti (mysql nazývám parodií na SQL databáze).
Ale obecně to samozřejmě lze v SQL řešit a je správně to řešit.

Řešení existuje víc, neumím pochopit z popisu, jestli je to vždy:
START
STOP
START
STOP
START
STOP

nebo jestli může nastat situace:
START
STOP
STOP
STOP
START
STOP
STOP
START
STOP

Podle toho se pak v SQL (a taky podle schopností databáze) liší řešení.

Jedním z možných řešení je využít subselecty:

Kód: [Vybrat]
SELECT
[sloupce],
(SELECT ...nejbližší_stop... FROM [tabulka_stopů] WHERE [vodné podmínky])
FROM
[tabulka_startů]

V PostgreSQL by se to řešilo pomocí
Kód: [Vybrat]
JOIN LATERAL, protože subselecty jsou nevýkonné.

Lze to pravděpodobně řešit i JOINEM, jak jste psal. Tam pak záleží na tom, jak jsou data uspořádaná. Pomocí WHERE a DISTINCT ON zle vyfiltrovat a setřídit data tak, aby se ke každému startu našel nejbližší stop, nebo všechny související stopy.

Osobně si myslím, ale opravdu nejsem znalý, že je to přes schopnosti MySQL.

Určitě je správné to řešit na úrovni SQL, řešit to v PHP je prasárna. Do PHP byste si musel natáhnout spoustu dat a v jeho pomalém kódu řešit filtrování. Když to ponecháte na SQL, má databáze možnost dotaz optimalizovat (značná úspora času) a navrátit Vám jen data, která žádáte.

Za dotaz, jestli můžu, tak chválím. Většinou to prasátka napíší v PHP a ani je nenapadne, že by přesně tyto operace mělo řešit SQL, že od toho je.

Re:SQL JOIN priradene stlpca podla ID
« Odpověď #4 kdy: 11. 11. 2020, 13:24:13 »
je to mssql. a sitaucia je start stop. Nie je mozne dostat 2x po sebe rovnaku hodnotu.
Vyriesil som to inak resp. skusam na to ist s inej strany. Viem si spocitat kolko bol cas za 1 den na jeden reason. (Tu je problem v tom ze v niektore dni nemusi byt ziaden niekedy aj 5). Problem mi roby to ze to neviem rozlozit v case. A sice ak mam rozsah 5 dni tak potrebujem sum za kazdy den.
Teda otazka je ako upravit
Kód: [Vybrat]
SELECT SUM (DATEDIFF(SECOND, start_time, stop_time)) as break_time WHERE reason='46' AND start_time between '2020-10-05 00:00:00.000' and '2020-10-11 23:00:00.000'tak aby mi to vracalo hodnoty den po dni.


Re:SQL JOIN priradene stlpca podla ID
« Odpověď #5 kdy: 11. 11. 2020, 13:27:49 »
Použijete vnořený select. Ve vnitřní selectu spočítáte dobu trvání v jednotlivých záznamech, ve vnějších to pak sesumujete a přijoinujete text pro reason.

Pro příště, když se ptáte na nějaké SQL dotazy, připojte i strukturu tabulek – alespoň ty sloupce, o kterých píšete. Je to pak pro čtenáře mnohem přehlednější, než když to musí reverzinženýrovat z vašeho popisu.

Re:SQL JOIN priradene stlpca podla ID
« Odpověď #6 kdy: 11. 11. 2020, 13:32:11 »
No nejdřív si spojte související události start-stop k sobě. Cílem je "tabulka", ve které bude na jednom řádku spolu související start a stop.

Pak si potřebujete doplnit "sloupec", který z timestampu udělá jen obyčejný date. Samozřejmě, že si musíte určit, jestli je rozhodný den startu, nebo stopu. Můžete si doplnit ještě vypočtenou dobu mezi startem a stopem.

Pokud tyto data máte, osobně bych si je vystavěl jako VIEW.
Nad tím view pak můžete pomocí WHERE omezit datum a pomocí sum, count sečíst časy nebo spočítat četnost a pomocí GROUP BY určit, jestli je to po dnech, dekádách, pětiletkách :).

Re:SQL JOIN priradene stlpca podla ID
« Odpověď #7 kdy: 11. 11. 2020, 13:51:45 »
No nejdřív si spojte související události start-stop k sobě. Cílem je "tabulka", ve které bude na jednom řádku spolu související start a stop.
Nechtěl byste si nejdřív přečíst zadání? Že je to MS SQL je tam napsané. Že jsou start_time a stop_time dva sloupečky v jedné tabulce je hned v zadání a je to vidět i z jednoho selectu. Zatím jste napsal dva komentáře, z toho dva úplně mimo dotaz. To není dobré skóre.