SQL-带重置的窗口计数
我正在使用sql并尝试实现以下结果(运行\u count) 我曾尝试过窗外的计数功能,但我不知道如何实现计数器的复位SQL-带重置的窗口计数,sql,function,count,sap,hana,Sql,Function,Count,Sap,Hana,我正在使用sql并尝试实现以下结果(运行\u count) 我曾尝试过窗外的计数功能,但我不知道如何实现计数器的复位 select *, count(1) over (partition by ID, DATE order by DATE rows unbounded preceding) -1 as "run_count" from table 我的(可结果的)应该是这样的。计数应在两天之间重置,但当a和B之间出现时,计数也应重置 ID Date Flag Running_
select *,
count(1) over
(partition by ID, DATE order by DATE rows unbounded preceding) -1 as "run_count" from table
我的(可结果的)应该是这样的。计数应在两天之间重置,但当a和B之间出现时,计数也应重置
ID Date Flag Running_Count
1 10/10 A 1
**2 10/10 B 0** -> reset
**3 10/10 B 0** -> reset
4 10/10 A 1
5 10/10 A 2
6 10/10 A 3
1 11/10 B 0
2 11/10 B 0
3 11/10 A 1
4 11/10 A 2
5 11/10 A 3
6 11/10 A 4
**7 11/10 B 0** -> reset
8 11/10 A 1
你似乎想从每天开始,把“A”和“B”分开数一数
如果是这样,您可以将组定义为每个值之前的“B”数,然后进行一些计算:
select t.*,
(case when flag = 'A' then row_number() over (partition by date, grp, flag order by id)
else 0
end) as running_count
from (select t.*, sum(case when flag = 'B' then 1 else 0 end) over (partition by date order by id) as grp
from t
) t;
是一个rextester(使用Postgres)。请尝试下面的SQLScript select语句 有可能会更容易解决。我使用Subselect一步一步地显示解决方案 内部most SELECT使用以下命令检查是否从另一个值更改为“a” 下面的SubSelect使用SUM()聚合函数和前面的无界选项执行解决方案 最外层的SELECT使用Row_Number()函数创建所需的计数值
select
id,
date,
flag,
case when flag = 'A' then
row_number() over (partition by date, groupid order by id)
else 0
end as rn
from (
select
id,
date,
flag,
sum(is_change) over (partition by date order by id rows unbounded preceding) groupid -- running sum
from (
select
id,
date,
flag,
case
when
flag = 'A' and
(
(lag(flag, 1) over (partition by date order by id)) is null or
(lag(flag, 1) over (partition by date order by id)) = 'B'
) -- check prev
then 1
else 0
end as is_change
from TblTest
) tbl
) t
order by date, id
我希望它是有用的,可以用于您的发展
您可以根据B标志出现的数量定义分组,然后使用Row_number为每个组的行编号:
SELECT
ID,
date,
flag,
CASE WHEN flag = 'B' THEN 0 ELSE ROW_NUMBER() OVER (PARTITION BY date, B_COUNT ORDER BY ID) END AS "RUNNING_COUNT"
FROM
(
SELECT
TA.ID,
TA.date,
TA.flag,
CASE WHEN SUM(TB.COUNT) IS NULL AND flag = 'A' THEN 0 ELSE SUM(TB.COUNT) END AS B_COUNT
FROM
table TA
LEFT JOIN
(
SELECT
ID, date, 1 AS "COUNT"
FROM
table
WHERE
flag = 'B'
) TB ON TA.date = TB.date AND TA.ID > TB.ID AND TA.flag = 'A'
GROUP BY
TA.ID,
TA.date,
TA.flag
)
ORDER BY
date, ID, flag;
它会给你预期的结果。请解释你的计数逻辑,并用你正在使用的数据库标记问题。我已经完成了。谢谢。谢谢,但你不是100%正确。是的,我想每天计算A和B的分离数,但当A和B在A之间时也是如此。@user3733265。这就是它的作用。@user3733265。我明白了<在
分区依据
子句中需要code>标志。我添加了一个测试仪。这是专为博士后准备的,但它的工作方式应该完全相同。