如何计算行数,以便连续出现的数据计为1?

这种情况是我试图计算表中数据的出现次数,只是我想将连续出现的次数计算为1。这是一个示例。

输入:

|item    |statusid|
|--------|--------|
| pencil | A      |
| pencil | B      |
| pencil | C      |
| pencil | A      |-Counts
| pencil | A      |-as one
| pencil | B      |
| pencil | A      |
| eraser | D      |-Counts
| eraser | D      |-as one
| eraser | E      |
| eraser | F      |
| eraser | D      |
| eraser | E      |
| eraser | F      |

我如何在SQL Server中使用存储过程来输出如下内容:

输出:

|item    |statusid|occurence|
|--------|--------|---------|
| pencil | A      |  3      |
| pencil | B      |  2      |
| pencil | C      |  1      |
| eraser | D      |  2      |
| eraser | E      |  2      |
| eraser | F      |  2      |

编辑:该表假定存在一个datetime列,可用于对行进行排序。

theresa88520 回答:如何计算行数,以便连续出现的数据计为1?

具有select [item],[statusid],count(*) occurence from ( select *,lag([item]) over (order by (select null)) previtem,lag([statusid]) over (order by (select null)) prevstatusid from tablename ) t where [item] <> previtem or [statusid] <> prevstatusid or (previtem is null and prevstatusid is null) group by [item],[statusid] 窗口功能:

> item   | statusid | occurence
> :----- | :------- | --------:
> pencil | A        |         3
> pencil | B        |         2
> pencil | C        |         1
> eraser | D        |         2
> eraser | E        |         2
> eraser | F        |         2

请参见demo
结果:

Process.Kill()

注意:检查@SeanLange的评论之一中的链接。
此代码适用于您发布的样本数据以及相对较小的表,但不适用于非常大的表。
无论如何,您都需要一个确定行顺序的列。

,
with cte as
 (
   select item,statusid,-- tag consecutive rows with the same status
      case when lag(statusid) 
                over (partition by item
                      order by whatever) = statusid -- same status
           then 0 -- remove or
           else 1 -- keep in next step
      end as flag
   from mytable
 )
select item,count(*)
from cte
where flag = 1 -- now remove those rows
group by item,statusid
本文链接:https://www.f2er.com/3148847.html

大家都在问