我有一个表,
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
在这里,我想要一个特定名称的新列,它由";该值达到>-1仅在满足-1之后"。所以在这个特定的数据中,我想要一个新的列作为名称";a";它的值为3,因为一旦在Status_measure中达到-1,我们就有3个值(15、20和12(>-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。
请编辑您的问题,如果需要,您可以将其复制/粘贴到原始问题中,并根据要求提供额外的澄清(自动递增以及这是最终输出/确定中断的影响(。