计算每个ID的连续状态

时间:2017-08-28 22:31:41

标签: sql sql-server count partition

我正在尝试查找至少有3个连续项目的客户列表,这些项目已经过处理"。以下是我的表格:

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(因为它有9个连续处理的记录,分别来自9,12,14,16)

正如您所看到的,我定义了"连续"作为具有相同ClientID而不是表中下一条记录的下一条记录,这就是我遇到的问题。当表中的下一个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

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:0)

在您的示例中,没有超过5个连续项目的客户(在您的选择中检查&gt; = 10)。

寻找3个项目,返回1&amp; 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