1

私はSQLiteが初めてです。SQLite Manager Firefox アドオンを使用しています。データベースとテーブルを作成しました。このテーブルには、Web カメラの記録が格納されます。各レコードは 3 分までの録音です。連続録画ごとに 1 つのレコードを取得しようとしています。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

これを解決するためにあなたの助けをいただければ幸いです。

4

1 に答える 1

0

SQL Server クエリは、レコードを再帰的に調べて、1 つのグループに属するすべてのレコーディングを見つけます。このような再帰的な構築は、SQLite では不可能です。

ただし、チェックを逆にすることでグループを見つけることができます。r1以前の記録 ( ) との差r2が 3 分を超える場合 (または以前の記録がない場合)、記録はグループ ( ) の最初の 1 つになります。グループの開始点を取得したら、次のレコード ( r3) との差r4が 3 分より大きい (または次のレコードがない) 最初の次のレコード ( ) を見つけることで終了を計算できます。

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

(これは、終了と次の開始の間の差としてギャップを計算します。これは、例ではわずか 1 秒です。3*60 のしきい値を減らしたい場合があります。)

于 2013-08-29T20:03:27.310 に答える