Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-带重置的窗口计数_Sql_Function_Count_Sap_Hana - Fatal编程技术网

SQL-带重置的窗口计数

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_

我正在使用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_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>标志。我添加了一个测试仪。这是专为博士后准备的,但它的工作方式应该完全相同。