2013-08-29 79 views
1

我是SQLite的新手。我正在使用SQLite Manager Firefox插件。我创建了一个数据库和一个表。此表存储摄像头录制。每条记录最多可录制3分钟。我正在尝试每连续录制一个记录。如果间隔超过3分钟,则会被视为单独录制。以下是脚本。以单条记录检索多条记录

CREATE TABLE recordings ( 
    [key]   INTEGER  PRIMARY KEY ASC AUTOINCREMENT, 
    filename  VARCHAR(50), 
    start_datetime DATETIME, 
    end_datetime DATETIME, 
    deleted  BOOLEAN 
); 

INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f1', '2013-08-26 00:00:00', '2013-08-26 00:03:00', 0); 
INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f2', '2013-08-26 00:03:01', '2013-08-26 00:06:00', 0); 
INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f3', '2013-08-26 00:06:01', '2013-08-26 00:09:00', 0); 

INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f4', '2013-08-26 00:14:00', '2013-08-26 00:17:00', 0); 
INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f5', '2013-08-26 00:17:01', '2013-08-26 00:20:00', 0); 
INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f6', '2013-08-26 00:20:01', '2013-08-26 00:23:00', 0); 

INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f7', '2013-08-26 00:30:00', '2013-08-26 00:33:00', 0); 
INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f8', '2013-08-26 00:33:01', '2013-08-26 00:36:00', 0); 
INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f9', '2013-08-26 00:36:01', '2013-08-26 00:39:00', 0); 

INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f10', '2013-08-26 00:44:00', '2013-08-26 00:47:00', 0); 
INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f11', '2013-08-26 00:47:01', '2013-08-26 00:50:00', 0); 
INSERT INTO [recordings] ([filename], [start_datetime], [end_datetime], [deleted]) VALUES ('f12', '2013-08-26 00:50:01', '2013-08-26 00:53:00', 0); 

的结果应该是像下面,

recording1  2013-08-26 00:00:00  2013-08-26 00:09:00 
recording2  2013-08-26 00:14:00  2013-08-26 00:23:00 
recording3  2013-08-26 00:30:00  2013-08-26 00:39:00 
recording4  2013-08-26 00:44:00  2013-08-26 00:53:00 

我试图达到使用CTE同样使用的是SQL Server,但它不是在SQLite的支持。以下是CTE的方式,

with cte 
as 
(
select [KEY],start_datetime,end_datetime,1 as recodringno from [dbo].[recordings] where [KEY] =1 
union all 
select a.[KEY],a.start_datetime,a.end_datetime 
,case when DATEDIFF(MINUTE,b.end_datetime,a.end_datetime)>3 then b.recodringno+1 else b.recodringno end 

as recodringno from 
[dbo].[recordings] a 
inner join cte b on a.[KEY]=b.[KEY]+1 

) 
select 'recodring'+cast(recodringno as varchar(10)) as recodringno 
,MIN(start_datetime)start_datetime,MAX(end_datetime) end_datetime from cte group by recodringno 

我希望你能帮到解决这个问题。

回答

0

您的SQL Server查询遍历记录以查找属于单个组的所有记录。 这样的递归构造在SQLite中是不可能的。

然而,可以通过翻转检查发现组: 记录是一组(r1)如果差到以前的记录(r2)超过三分钟,第一个(或有没有以前的录音)。 一旦我们有一个组的开始,我们可以通过找到与下一个记录(r4)大于三分钟(或没有下一个记录)相差的第一个后续记录(r3)来计算结束:

SELECT r1.start_datetime AS start, 
     (SELECT MIN(r3.end_datetime) 
     FROM recordings AS r3 
     WHERE r3.start_datetime >= r1.end_datetime 
      AND IFNULL((SELECT MIN(strftime('%s', r4.start_datetime)) 
         FROM recordings AS r4 
         WHERE r4.start_datetime >= r3.end_datetime), 
        99999999999) - strftime('%s', r3.end_datetime) > 3*60 
     ) AS end 
FROM recordings AS r1 
WHERE strftime('%s', r1.start_datetime) - 
     IFNULL((SELECT MAX(strftime('%s', r2.end_datetime)) 
       FROM recordings AS r2 
       WHERE r2.end_datetime <= r1.start_datetime), 
      0) > 3*60 

(这会计算出结束和下一次启动之间的差距,在您的示例中这只是一秒,您可能想要降低3 * 60阈值。)