从每个 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
我正在尝试查找至少有 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