【问题标题】:SQL query for total number of continuous item checkSQL查询连续项目检查总数
【发布时间】:2020-07-23 04:54:47
【问题描述】:

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

示例 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] 将第一列视为毫秒,并按顺序排列

【问题讨论】:

  • 您的问题,就目前而言,无法回答,因为您没有提供一列来提供查找1 1 1 岛屿时要使用的排序
  • 谢谢你的回复蒂姆我没听懂你,你能解释一下吗。
  • 您需要添加一个 third 列,该列提供您看到的排序。 SQL 表有 NO 内部顺序。
  • 目前我用我得到的光标的循环实现了它,如果它继续或除以 3 比我添加到主变量中,其余我忽略,所以我得到总数。它不能重新排序,因为出现零将使大小写或 3 的倍数无效。
  • 您能否提供一个订购示例以及如何在这里工作?

标签: sql sqlite android-sqlite android-room


【解决方案1】:

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

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

创建一个带有自动增量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

【讨论】:

  • 完美就是我想要的,
  • Thomas 假设如果我还有一列用于日期时间戳并且想要考虑特定时间范围之间的事件发生,那么我该如何修改查询? (例如,发生在上午 9:00 到晚上 10:30 之间 - 时间必须以毫秒为单位)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2020-07-15
  • 2020-04-25
  • 2017-11-04
相关资源
最近更新 更多