Sql查询,用于在满足特定条件后对值进行计数



我有一个表,

Name   Seconds  Status_measure
a      0           10
a      10          13
a      20          -1
a      30          15
a      40          20
a      50          12
a      60          -1

在这里,我想要一个特定名称的新列,它由";该值达到&gt-1仅在满足-1之后"。所以在这个特定的数据中,我想要一个新的列作为名称";a";它的值为3,因为一旦在Status_measure中达到-1,我们就有3个值(15、20和12(&gt-1

所需数据帧:

Id   Name   Seconds  Status_measure    Value
1    a      0           10                3
2    a      10          13                3
3    a      20          -1                3
4    a      30          15                3
5    a      40          20                3
6    a      50          12                3
7    a      60          -1                3

我试着做

count(status_measure>-1) over (partition by name order by seconds)

但这并没有给出任何想要的结果

您可以分两步完成,对数据进行分组,对grp=1的条目进行计数。

select *, sum(Status_measure > -1 and grp = 1) over(partition by name) n
from (
select *
, row_number() over(partition by name order by Seconds) - sum(Status_measure > -1 ) over(partition by name order by Seconds) grp
from tbl 
) t 

一个选项正在使用变量更新,它是:

  • 从0开始
  • 达到-1时增加其值
  • 达到秒-1时减小其值

一旦你有了这个列,你就可以对你的值求和。

SET @change = 0;
SELECT *, SUM(CASE WHEN Status_measure = -1
THEN IF(@change=0, @change := @change + 1, @change := @change - 1)
ELSE @change END) OVER() -1 AS Value_
FROM tab 

请在此处查看演示。

限制:此解决方案假设您只有一个介于-1s之间的有趣值范围。

注意:由于变量的第一次更新会在-1的同一行中留下1,因此总和会减少-1,这是您不希望的。为了更好地理解,请注释掉SUM() OVER的应用程序并查看中间输出。

首先要澄清您的问题。我想扩展您的原始数据,以包括另一行,以便2对3个条目。此外,在您的数据中是否有一些自动递增的ID,即顺序考虑适用的ID,如

Id   Name   Seconds  Status_measure    Value
1    a      0           10                3
2    a      10          13                3
3    a      20          -1                3
4    a      30          15                3
5    a      40          20                3
6    a      50          12                3
7    a      60          -1                3

如果是顺序的,并且您有ID1&ID#3处-1之上的2。这将指示两个条目。但是对于上面的ID 4-6,-1在ID#7之前有三个条目。

那么;VALUE";你想在你的成绩中有什么。所有行的最大计数为3,还是ID#1、2和3的值为2?Ids 4-7的值为3?或者,您是否希望所有条目识别-1之前的最大计数,以显示所有条目的3。

请编辑您的问题,如果需要,您可以将其复制/粘贴到原始问题中,并根据要求提供额外的澄清(自动递增以及这是最终输出/确定中断的影响(。

最新更新