我不确定你能不能从这里到达那里。您最好从实际执行传输的程序中记录错误代码。
你现在的桌子有一些问题。
CREATE TABLE filelog (
folder text,
filename text,
datatime timestamp,
filesize integer,
filesource text);
-- Your failed transfer . . .
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
-- . . . and a duplicate of it.
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
替换我的表名,您的查询是
select folder, filename, count()
from filelog group by folder, filename having count() < 3;
使用上面的数据,即使有两次失败,您的查询也不会返回任何行。(或者一个故障的两个副本。)修复它的第一步是声明一个可防御的主键。
CREATE TABLE filelog (
folder text,
filename text,
datatime timestamp,
filesize integer,
filesource text,
primary key (folder, filename, datatime)
);
该主键约束将阻止您两次输入单个传输。它允许您每天多次传输同一文件,这在第一次传输失败时可能有意义。
-- Your failed transfer . . .
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
-- . . . and an earlier transfer that also failed.
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-23 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-23 23:03:02',10,'S2');
您的查询将再次不返回任何行。我们需要更好地定义成功和失败的转移。
似乎成功的转移具有这些特征。
- 它包括所有三个源——S1、S2 和 S3。
- 它用于单个路径名,其中路径名表示文件夹 + 目录分隔符 + 文件名。
- 时间戳遵循文件源顺序。换句话说,S1 的“datatime”在 S2 的“datatime”之前,S2 的“datatime”在 S3 的“datatime”之前。
- 对于任何唯一的 {folder, filename, datatime},所有三个文件源的字节数都是相同的。
还有*大,麻烦的特性。. .
单个文件传输的所有三行必须属于单个“批次”(因为没有更好的词)。这意味着我们不能让查询将下面的前两行(传输失败)与下面的最后一行(成功传输的一部分)组合在一起,即使时间戳的顺序正确并且传输的字节是正确的.
folder1 file1 2012-08-29 23:01:02 10 S1
folder1 file1 2012-08-29 23:03:02 10 S2
folder1 file1 2012-08-29 23:45:02 10 S1
folder1 file1 2012-08-29 23:48:02 10 S2
folder1 file1 2012-08-29 23:53:02 10 S3
这会有些复杂。而且我可能完全误解了您成功转移的标准。
(您可能可以为“数据时间”列起一个更好的名称。)