当前位置: 首页 > 知识库问答 >
问题:

(SQLite)计算值连续重复3次的次数

钱德海
2023-03-14

我知道这是一个复杂的查询,因此我有一个单独的列,但该列包含几乎99%的null值(这是非常无效的),因此我想知道是否可以通过查询来实现这一点。

我有这样的桌子:

TransactionId | Value | ProductId
      1           3         2
      2           2         2           
      3           1         2
      4           0         4
      5           0         4
      6           0         4
      7           3         7
      8           3         7
      9           1         7
     10           0         3
     11           0         3
     12           0         3
     13           5         1
     14           2         1
     15           3         1
     16           0         4
     17           0         4
     18           0         4

现在的查询是,如果对于3个连续的产品ID,对应的值是0(按照TransactionId ASC的顺序),那么对于ProductId,它将被计为1,即。

ProductId | Count 
    4         2
    3         1

我们如何查询这个?

一个可选的简短问题:p

如果我有很多空值的列,可以吗?

共有2个答案

范翰飞
2023-03-14

首先使用CTE获取具有3个连续0的行,然后在表中只包括1(因此只计算1):

with 
cte as (
  select * from (
    select *,
      lag(transactionid) over (order by transactionid) previd,
      lead(transactionid) over (order by transactionid) nextid,
      lag(productid) over (order by transactionid) prevprodid,
      lead(productid) over (order by transactionid) nextprodid,
      lag(value) over (order by transactionid) prevvalue,
      lead(value) over (order by transactionid) nextvalue
    from tablename
  ) t
  where 
    productid = prevprodid and productid = nextprodid and 
    coalesce(value, 0) = 0 and  coalesce(prevvalue, 0) = 0 and coalesce(nextvalue, 0) = 0
),
triples as (select previd id from cte union all select nextid from cte)

select productid, count(*) counter 
from tablename 
where transactionid not in (select id from triples)
group by productid

请看演示
结果:

| ProductId | counter |
| --------- | ------- |
| 1         | 3       |
| 2         | 3       |
| 3         | 1       |
| 4         | 2       |
| 7         | 3       |
宰父宾实
2023-03-14

在最新版本的SQLite中,您可以使用lag()/led()

select product_id, count(*)
from (select t.*,
             (case when value = 0 and
                        lead(value, 1) over (partition by productid order by transactionid) = 0 and
                        lead(value, 2) over (partition by productid order by transactionid) = 0
                   then 1
              end) as three_zero_flag
      from t
     ) t
where three_zero_flag = 1
group by product_id
 类似资料:
  • 我试图解决一个问题,但没有成功。 我有两张号码单 我有一张桌子 现在我需要计算多少次从第二个列表的数字后从第一个列表的数字,但我应该只计算一个一个id 在上面的示例表中,结果应该是2 三个匹配的pars,但是因为我们只有两个不同的ID,结果是2而不是3 PAR: 笔记我使用MSSQL 编辑。还有一列确定顺序的日期 Edit2-解决方案 我写这个查询 在这之后,我计划按id分组,每个id只使用一个匹

  • 问题内容: 我非常怀疑我是否以最有效的方式执行此操作,这就是为什么我在此处进行了标记。对于 一千个测量系统,* 我需要在 20亿行 上运行。 * 您拥有一些测量系统,当它们失去连接时,它们通常会报告以前的值,并且有时会(但有时很长)会突然断开连接。您需要汇总,但是这样做时,您需要查看其重复的时间,并根据该信息进行各种筛选。假设您正在测量汽车的mpg,但它在20 mpg的情况下停留一个小时,然后移动

  • 我是开发Android应用程序的新手,我想做的是创建一个可以读取电源按钮按下时间的应用程序,以制作一个可访问性应用程序。 也许如果我能控制或计算屏幕打开和屏幕关闭事件,这可能会有所帮助。

  • 我已经将代码中的read整数修复为不再是I而是一个单独的变量“index”,并理解为什么我会收到Over Ofbound异常,但我有点厚,不明白如何在添加哨兵值0的同时修复它。

  • 我有一个数据帧: 谢谢!

  • 我正在尝试计算Pandas数据帧中一个值与另一个值一起出现的次数,并计算每行的次数。 这就是我的意思: 假设我想计算与,我希望结果是: 这里的< code>freq(频率)列表示< code>a列中的值与< code>t列中的值一起出现的次数。 请注意,考虑到我的数据帧的大小,仅计算发生的次数的解决方案将导致错误的频率。 有没有办法在Python中实现这一点?