我正在尝试查找至少有3个连续项目的客户列表,这些项目已经过处理"。以下是我的表格:
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
答案 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
答案 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