Üdv mindenkinek!
A hiányos sql ismereteim miatt hozzátok fordulok segítségért.
A problémám a következő:
Adott két tábla,
checkin ( id , date, time )
checkout ( id , date, time )
amelyek több folyamat kezdetét (checkin) és végét (checkout) tartalmazzák.
Egy folyamat többször is szerepel a táblákban különböző dátum/időpontokkal.
Szeretnék egy olyan sql lekérdezés írni ami
megmondja, hogy egy-egy folyamat mennyi ideig tartott.A problémám ott kezdődik hogy nem tudom megtalálni egy kezdő időpont befejező
időpont párját.
Talán a legegyszerűbb az volna ha valahogy sikerülne
az azonos id-vel rendelkező kezdő időpont rákövetkezőinek
(tőle későbbi dátumok/időpontok) a minimumát venni...
úgy hogy az így talált minimum előtt nincs újabb kezdő időpont ugyanazzal
az id-vel. (mert különben az a minimum annak a másik kezdetenek a párja lenne)
A MIN függvényt feltételben (where) nem lehet használni
(csak esetleg egy beágyazott lekérdezés select-jében) ezért nem tudom hogy
miként lehetne összerakni ezt a select-et.
Ha van valakinek ilyen irányú tapasztalata és nem nagy kérés akkor
adjon tanácsot ezzel kapcsolatban.
Köszönöm.
- 1212 megtekintés
Hozzászólások
Ha jól értem a problémád, akkor valami ilyesmit szeretnél:
SELECT
i.id,
sum((SELECT time from checkout as o WHERE i.time <= o.time AND i.id = o.id ORDER BY o.time ASC LIMIT 1) - i.time)
FROM checkin as i GROUP BY i.id;
- A hozzászóláshoz be kell jelentkezni
Majdnem...
Sajnos a dolog kicsit bonyolultab.
Egy folyamat átcsúszhat egy másik napra (akár többre is) és így nem elég csak a time értékekkel számolni. Másrészről szeretném ha a folyamatok hosszai külön-külön meglennének.
kb. ilyen adatok vannak a táblákban:
Checkin:
Id, Date, Time
1, 2006-08-01, 12:00
2, 2006-08-01, 12:10
3, 2006-08-02, 08:15
1, 2006-08-05, 13:10
2, 2006-08-06, 06:00
Checkout:
Id, Date, Time
1, 2006-08-03, 12:50
2, 2006-08-01, 12:13
1, 2006-08-05, 18:19
3, 2006-08-02, 08:15
2, 2006-08-06, 06:01
És valami ilyesmit szeretnék:
Id, Date, Time, Duration
1, 2006-08-01, 12:00, xx:xx
2, 2006-08-01, 12:10, xx:xx
3, 2006-08-02, 08:15, xx:xx
1, 2006-08-05, 13:10, xx:xx
2, 2006-08-06, 06:00, xx:xx
A segítséget előre is köszönöm.
--
maszili
- A hozzászóláshoz be kell jelentkezni
Én ezt úgy oldottam meg, hogy datetime mezőben tároltam a be és kilépéseket, és arra értelmezte a - (mínusz) operátort.
Van valami különösebb oka, hogy szétbontottad a dátumot és az időt?
Ha összevonod, akkor a GROUP nélkül jó eredményt kapsz:
SELECT
i.id,
sum((SELECT time from checkout as o WHERE i.time <= o.time AND i.id = o.id ORDER BY o.time ASC LIMIT 1) - i.time)
FROM checkin as i;
Az általad használt SQL motor dátum függvényei között biztosan találsz olyat, amivel össze tudod kombinálni a két mezőt.
Remélem segít valamit. (A napokban én is pont ezt csináltam)
- A hozzászóláshoz be kell jelentkezni
Van valami különösebb oka, hogy szétbontottad a dátumot és az időt?
Sokszor kell olyan listákat csinálni ami különböző időszakokra (dátum / időpont) vonatkozik.
--
maszili
- A hozzászóláshoz be kell jelentkezni
Ha van lehetőséged megváltoztatni a táblákat, meg az adatbetöltő programot, akkor miért nem generálsz egy egyedi IDt minden folyamathoz?
Az szerintem nagyon megkönnyítené az életedet, mert egy egyszerű lekérdezéssel kiderülne, hogy melyik folyamat mikorr indult ált le.
Csaba
- A hozzászóláshoz be kell jelentkezni
Egyetértek. Nálam is hasonló a megoldás: egy tábla van:
sessions (session_id, start_time, end_time)
minden folyamat induláskor beírja megát, kilépéskor pedig a kilépési időt beállítja. A lekérdezést ez nagyon leegyszerűsíti.
- A hozzászóláshoz be kell jelentkezni
Igazából én is egy táblát használok de két view segítségével próbáltam egyszerűsíteni a dolgot.
Az az egy tábla így néz ki:
TABLE (
id integer, <-- egyedi folyamat azonosító
type integer, <-- kilépés / belépés
location integer, <-- áthaladás helye
date date, <-- áthaladás dátuma
time time <-- áthaladás ideje
)
Előfordulhat, hogy egy folyamat esetén a location értéke különböző
lehet ... vagyis ugyanaz a folyamat bemegy a location=1 helyen és
kijön a location=2 helyen.
--
maszili
- A hozzászóláshoz be kell jelentkezni
Ha Date meg Time helyett DateTime -t hasznalnal, megsporolnal egy 1-1 mezot, es leroviditened a megoldast...
sorba veszed az elso tablabol a rekordokat, es azokban szereplo datetime szerint kiveszed a masodikbol, a >= elozo datetime-t, limit 1, es kesz is... szerintem... de lehet hogy te masra gondoltal.
- A hozzászóláshoz be kell jelentkezni
minek van egyaltalan kulon tablaban?
mod:
uhhh, az kicsit write only lett :)
- A hozzászóláshoz be kell jelentkezni
Köszönöm mindenkinek a segítséget!
A megoldás az lett hogy a DATE / TIME helyett TIMESTAMP lett amivel
egyszerűen lehet számolni.
Valamint a korábban tanácsolt lekérdezést (kicsit módosítva) használom.
Mégegyszer köszönöm!
--
maszili
- A hozzászóláshoz be kell jelentkezni