SQL查询连续项检查总数

SQL query for total number of continuous item check

SQLITE/SQL查询连续记录总数,PFA图像。 这里我在 table 中有 1 和 0。 假设我想检查 1 的总数,它们正好是 3 的倍数,或者你可以说是连续的。如果为零,则不予考虑。

示例 A:-(水平显示列值)

1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 

因此出现的总次数是 8 任何序列除以 3。

[编辑 2] 将第一列视为毫秒及其顺序

考虑到我们可以使用 deviceid 对行进行排序并对序列进行计数,因此尝试回答您的问题

请注意,为了工作,您至少应该拥有 sqlite 版本 3.25,因为这需要 window 个函数

正在创建一个测试 table 具有自动递增 deviceid 列,这将模拟您自己的数据

CREATE TABLE "test" (
    "deviceid"  INTEGER,
    "password"  INTEGER,
    PRIMARY KEY("deviceid" AUTOINCREMENT)
);

按照您自己的顺序插入行1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1

DELETE FROM test;
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (0); 
INSERT INTO test (password) VALUES (1); 
INSERT INTO test (password) VALUES (1);

解决方案:

select password, sum(div_floor) AS Number_of_3_occurences
FROM (
    select password, count(*) as cnt_sequence, cast(round(count(*) / 3 ) as int) as div_floor
    from (select test.*,
                 (row_number() over (order by deviceid) -
                  row_number() over (partition by password order by deviceid)
                 ) as grp
          from test
         ) t
    group by grp, password
) ttt
where  cnt_sequence>=3
group by password 

结果

password  Number_of_3_occurences
0         2
1         8