2013-08-29 81 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閾值。)