从每个 ID 计算连续状态

count consecutive statuses from each ID

我正在尝试查找至少有 3 个连续项目 "processed" 的客户列表。以下是我的 table 的样子:

ClientID ItemID 状态

1 1 待处理

1 2 已处理

1 3 已处理

2 4 已处理

2 5 已处理

1 6 已处理

1 7 待定

2 8 待定

2 9 已处理

3 10 待处理

3 11 待定

2 12 已处理

3 13 待处理

2 14 已处理

1 15 已处理

2 16 已处理

预期结果:

1(因为它从 2、3、6 连续处理了 3 条记录)

2(因为它有 4 个连续处理的记录,来自 9、12、14、16)

如您所见,我将 "consecutive" 定义为具有相同 ClientID 的下一条记录,而不是 table 中的下一条记录,这就是我遇到的问题。当 table 中的下一个 clientid 不同时,我的计数器将重新启动。

我的尝试:

WITH count
AS
(
    SELECT *, COUNT(1) OVER(PARTITION BY clientid, count) NotPending
    FROM (
        SELECT *, (
            SELECT COUNT(ItemId)
            FROM ##temp a
            WHERE status like '%pend%'
              AND ItemId < b.ItemId) AS count
        FROM  ##temp b
        WHERE status not like '%pend%'

    ) t1

)
SELECT distinct clientid from count where NotPending >= 3

在您的示例中,没有客户拥有超过 5 个连续的项目(在您的 Select 中,您检查 >= 10)。

正在寻找 3 项,returns 1 和 2 用于您的示例数据:

WITH cte AS
 (
   SELECT ClientID, ItemID, Status,
      -- returns 3 when there's only 'Processed'
      Sum(CASE WHEN Status = 'Processed' THEN 1 end) 
      Over (PARTITION BY ClientID
            ORDER BY ItemId
             -- 3 rows including current row
            ROWS 2 Preceding) AS Cnt
   FROM ##temp
 )
SELECT DISTINCT ClientID
FROM cte
WHERE Cnt = 3

您可以使用 row_number() 将具有相同连续状态的行放在同一组中:

select *,
  row_number() over (partition by ClientId order by ItemId) 
  - row_number() over (partition by ClientId, ItemStatus order by ItemId) as groupName
from Table1
order by ClientId, ItemId

然后你可以统计每组的条目数:

select distinct ClientId, count(*) from (
    select *,
      row_number() over (partition by ClientId order by ItemId) 
      - row_number() over (partition by ClientId, ItemStatus order by ItemId) as groupName
    from Table1
) t 
where ItemStatus = 'Processed'
group by ClientId, groupName
having count(*) >= 3

Demo