Sqlite 从EventTime输入和退出SQLLite时间
我有两个表,数据和事件,其中包含以下数据:Sqlite 从EventTime输入和退出SQLLite时间,sqlite,Sqlite,我有两个表,数据和事件,其中包含以下数据: EVENTS EventIndex ObjID LocID EventData EventTime EventType 83707365 3519434 10376 0 2013-05-19 11:32:11 137 83707849 3519434 10374 0 2013-05-19 11:35:18 137 83714233 888799 10376
EVENTS
EventIndex ObjID LocID EventData EventTime EventType
83707365 3519434 10376 0 2013-05-19 11:32:11 137
83707849 3519434 10374 0 2013-05-19 11:35:18 137
83714233 888799 10376 0 2013-05-19 12:24:45 137
83715200 888799 10184 0 2013-05-19 12:32:18 137
DATA
EventIndex TagName TagValue
83714233 ObjName Peter
83714233 LocName H118
83715200 ObjName Peter
83715200 LocName H116
83707365 ObjName John
83707365 LocName H118
83707849 ObjName John
83707849 LocName H116
从哪里开始使用SQLLite查询
我想得到结果:
Name Location Entry Exit Total
Peter H118 12:24:45 12:32:18 00:07:33
John H118 11:32:11 11:35:18 00:03:07
Hi meewoK,可以给出以下情况:
姓名地点出入境合计
彼得H118 12:24:45 12:32:18 00:07:33
约翰H118 11:32:11 11:35:18 00:03:07
约翰H118 11:44:52 11:45:27 00:00:35
约翰H118 12:31:15 12:32:46 00:01:31
我正在尝试修改您的查询,但找不到解决方案。谢谢
此代码在SQL SERVER中工作:
选择E.EventIndex,N.tagvalue作为名称,L.tagvalue作为位置,E.eventtime作为条目,NEV[退出]
从…起
[事件]E
E.EventIndex=N.EventIndex和N.tagname='ObjName'上的内部联接[DATA]N
E.EventIndex=L.EventIndex和L.tagname='LocName'上的内部联接[DATA]L
外敷
选择TOP 1 NE.eventtime作为[退出]
从…起
[事件]NE
NE.EventIndex=NL.EventIndex和NL.tagname='ObjName'上的内部联接[DATA]NL
哪里
NE.EventIndex>E.EventIndex
和NL.tagvalue=N.tagvalue
订购人
事件索引
) NEV
其中L.tagvalue='H118'
有人能帮我把它传给SQLite吗?
谢谢这里是一个用于处理表的快速SQL转储
CREATE TABLE EVENTS (EventIndex int, objID int, eventtime datetime);
INSERT INTO "EVENTS" VALUES(83707365,3519434,'2013-05-19 11:32:11');
INSERT INTO "EVENTS" VALUES(83707849,3519434,'2013-05-19 11:35:18');
INSERT INTO "EVENTS" VALUES(83714233,888799,'2013-05-19 12:24:25');
INSERT INTO "EVENTS" VALUES(83714233,888799,'2013-05-19 12:32:18');
CREATE TABLE DATA (eventindex int, tagname char, tagvalue char);
INSERT INTO "DATA" VALUES(83714233,'ObjName','Peter');
INSERT INTO "DATA" VALUES(83714233,'LocName','H118');
INSERT INTO "DATA" VALUES(83715200,'ObjName','Peter');
INSERT INTO "DATA" VALUES(83715200,'LocName','H118');
INSERT INTO "DATA" VALUES(83707365,'ObjName','John');
INSERT INTO "DATA" VALUES(83707849,'ObjName','John');
INSERT INTO "DATA" VALUES(83707365,'LocName','H118');
INSERT INTO "DATA" VALUES(83707849,'LocName','H118');
步骤1,获取每个对象的最大和最小事件类型:
现在,这揭示了数据结构的一些问题。对于每个对象,您有两个EventIndex,那么您应该选择哪一个?在这里,我只选择了其中最小的一个
步骤2,因为sqlite3不喜欢对聚合执行操作,所以我们将其放入一个视图中:
CREATE VIEW single_events AS
SELECT ObjID, Min(EventIndex) as EventIndex, Min(EventTime) as Entry, Max(EventTime) as Exit FROM EVENTS GROUP BY ObjID;
步骤3,通过在视图上操作获取总时间:
SELECT *, time(strftime('%s', exit) - strftime('%s', entry), 'unixepoch') as total
FROM single_events;
ObjID EventIndex Entry Exit total
---------- ---------- ------------------- ------------------- ----------
888799 83714233 2013-05-19 12:24:25 2013-05-19 12:32:18 00:07:53
3519434 83707365 2013-05-19 11:32:11 2013-05-19 11:35:18 00:03:07
第4步,将其与数据合并
当然,如果它是一个非常大的数据集,那么在运行步骤4之前将d1和d2放入一个临时表可能会对您有所帮助。类似的内容可以让您很好地开始工作: SQL Fiddle: 我添加了额外的事件,以防止退出一个事件被视为进入另一个事件 上述查询可以优化,如果我们说不能在不同的日期进行进入和退出,例如用户进入晚上11:59,离开凌晨1:00
SELECT d.TagValue AS Name,
d2.TagValue AS LOCATION,
e.eventTime AS Entry,
( SELECT eventtime
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime > e.eventTime LIMIT 1) AS ExitTime,
(e.eventTime -
( SELECT eventtime
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime > e.eventTime AND
DATE(e2.eventTime) = DATE(e.eventTime) LIMIT 1)) AS TotalTime
FROM events e,
DATA d,
DATA d2
WHERE e.eventIndex = d.eventIndex
AND e.eventIndex = d2.eventIndex
AND d.TagName = "ObjName"
AND d2.TagName = "LocName"
AND mod(
( SELECT count(*)
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime < e.eventTime AND
DATE(e2.eventTime) = DATE(e.eventTime)),2) = 0
ORDER BY EventTime;
出入境记录有什么区别?事件表中没有此类信息。Hi CL,差异在表数据中。事件83714233在H118中定位Peter,事件83715200在H116中定位Peter,因此我们知道83715200是输出事件,如果我已经解释过的话。谢谢,请问哪种RDBMS和版本?EventIndex是否始终递增?是否确定eventType始终相同?另外,如果一个人有两个以上的活动,会发生什么?这些数字是每天的吗?那么H118是入口,H116是出口,LocName标签的任何其他内容都可以忽略?那么为什么输出中会有位置列呢?嗨,meewoK,谢谢。参观是否包括寻找入口和出口?我需要找到那些在H118地点有过一系列约会的人。这两个人能相隔多远?任何人相隔一天的两次点击之间会发生什么?在queryWell中显示它们,第一个查询跨日期工作。基本上,对一个阅读器的任何点击之后都必须对另一个阅读器进行另一次点击。如果有人连续多次打牌,就会出现问题。。。你需要更复杂的逻辑。顺便说一句,这让我想起了我以前见过的RFID。您是否有机会使用名为centaur的软件系统,该系统将连接到rfid阅读器的控制器的事件记录在MS SQL中?只是好奇…哦…如果您不关心特定查询的退出时间和只关心进入时间,那么逻辑就变得容易多了…SQLite3不支持mod函数(默认情况下)。请参阅@MrGumble,是的,这是来自合并问题,其中没有提到SQLLite。在任何情况下,我看到SQLLite支持%这是一样的。在算术下。我已经更新了代码,并使用sqlLite更新了fiddle::
SELECT d1.TagValue as Name, d2.TagValue as Location, Entry, Exit, time(strftime('%s', exit) - strftime('%s', entry), 'unixepoch') as total
FROM single_events
LEFT JOIN DATA as d1 USING (EventIndex)
LEFT JOIN DATA as d2 USING (EventIndex)
WHERE d1.tagname = 'ObjName' AND d2.tagname = 'LocName';
SELECT d.TagValue AS Name,
d2.TagValue AS LOCATION,
e.eventTime AS Entry,
( SELECT eventtime
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime > e.eventTime LIMIT 1) AS ExitTime,
(e.eventTime -
( SELECT eventtime
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime > e.eventTime LIMIT 1)) AS TotalTime
FROM events e,
DATA d,
DATA d2
WHERE e.eventIndex = d.eventIndex
AND e.eventIndex = d2.eventIndex
AND d.TagName = "ObjName"
AND d2.TagName = "LocName"
AND mod(
( SELECT count(*)
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime < e.eventTime),2) = 0
ORDER BY EventTime;
NAME LOCATION ENTRY EXITTIME TOTALTIME
John H118 May, 19 2013 11:32:11+0000 May, 19 2013 11:35:18+0000 -307
Peter H118 May, 19 2013 12:24:45+0000 May, 19 2013 12:32:18+0000 -773
SELECT d.TagValue AS Name,
d2.TagValue AS LOCATION,
e.eventTime AS Entry,
( SELECT eventtime
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime > e.eventTime LIMIT 1) AS ExitTime,
(e.eventTime -
( SELECT eventtime
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime > e.eventTime AND
DATE(e2.eventTime) = DATE(e.eventTime) LIMIT 1)) AS TotalTime
FROM events e,
DATA d,
DATA d2
WHERE e.eventIndex = d.eventIndex
AND e.eventIndex = d2.eventIndex
AND d.TagName = "ObjName"
AND d2.TagName = "LocName"
AND mod(
( SELECT count(*)
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime < e.eventTime AND
DATE(e2.eventTime) = DATE(e.eventTime)),2) = 0
ORDER BY EventTime;
SELECT d.TagValue AS Name,
d2.TagValue AS LOCATION,
e.eventTime AS Entry,
( SELECT eventtime
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime > e.eventTime LIMIT 1) AS ExitTime,
(e.eventTime -
( SELECT eventtime
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime > e.eventTime LIMIT 1)) AS TotalTime
FROM events e,
DATA d,
DATA d2
WHERE e.eventIndex = d.eventIndex
AND e.eventIndex = d2.eventIndex
AND d.TagName = "ObjName"
AND d2.TagName = "LocName"
AND (
( SELECT count(*)
FROM EVENTS e2
WHERE e2.objID = e.objID
AND e2.eventTime < e.eventTime)%2) = 0
ORDER BY EventTime;