Sql server 在NOT NULL时重新启动NULL的累计计数

Sql server 在NOT NULL时重新启动NULL的累计计数,sql-server,tsql,Sql Server,Tsql,我想添加一个列,通过在非空列之前递增地计算空列的数量来指示在接受邀请之前收到的邀请人数,同时划分人员ID并按邀请日期排序 我的表格的格式如下: | UNIQUE_ID | PERSON_ID | INVITED_DATE | ACCEPTED_DATE | | 12345 | 567 | 12-01-18 | NULL | | 12346 | 567 | 12-02-18 | NULL | | 12347

我想添加一个列,通过在非空列之前递增地计算空列的数量来指示在接受邀请之前收到的邀请人数,同时划分人员ID并按邀请日期排序

我的表格的格式如下:

| UNIQUE_ID | PERSON_ID | INVITED_DATE | ACCEPTED_DATE |
| 12345     | 567       | 12-01-18     | NULL          |
| 12346     | 567       | 12-02-18     | NULL          |
| 12347     | 567       | 12-03-18     | NULL          |
| 12348     | 567       | 12-04-18     | 12-04-18      |
| 12349     | 567       | 12-05-18     | NULL          |
| 12350     | 568       | 12-01-18     | NULL          |
| 12351     | 568       | 12-02-18     | 12-02-18      |
理想情况下,输出应如下所示:

| UNIQUE_ID | PERSON_ID | INVITED_DATE | ACCEPTED_DATE | INVITES_BEFORE_ACCEPT |
| 12345     | 567       | 12-01-18     | NULL          |  1                    |
| 12346     | 567       | 12-02-18     | NULL          |  2                    |
| 12347     | 567       | 12-03-18     | NULL          |  3                    |
| 12348     | 567       | 12-04-18     | 12-04-18      |  0                    |
| 12349     | 567       | 12-05-18     | NULL          |  1                    |
| 12350     | 568       | 12-01-18     | NULL          |  1                    |
| 12351     | 568       | 12-02-18     | 12-02-18      |  0                    |
到目前为止,我已经尝试了使用OVER和PARTITION对行数进行多次迭代,但我发现它需要一个外部应用程序。以下外部应用对数据进行计数,但不会在成功接受后重新启动计数

SELECT t.* , invites.INVITES_BEFORE_ACCEPT
FROM table t
OUTER APPLY (
    SELECT COUNT(*) INVITES_BEFORE_ACCEPT
    FROM table t2
    WHERE t.PERSON_ID = t2.PERSON_ID and t.INVITED_DATE < t2.ACCEPTED_DATE
            ) invites
一种方法是

WITH t
     AS (SELECT *,
                COUNT(ACCEPTED_DATE)
                  OVER (
                    PARTITION BY PERSON_ID
                    ORDER BY INVITED_DATE) AS Grp
         FROM   [table])
SELECT *,
       SUM(CASE
             WHEN ACCEPTED_DATE IS NULL
               THEN 1
             ELSE 0
           END)
         OVER (
           PARTITION BY PERSON_ID, Grp
           ORDER BY INVITED_DATE) AS INVITES_BEFORE_ACCEPT
FROM   t