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

时间:2019-11-06 21:28:14

标签: sql sql-server database

这种情况是我试图计算表中数据的出现次数,只是我想将连续出现的次数计算为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列,可用于对行进行排序。

2 个答案:

答案 0 :(得分: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的评论之一中的链接。
此代码适用于您发布的样本数据以及相对较小的表,但不适用于非常大的表。
无论如何,您都需要一个确定行顺序的列。

答案 1 :(得分:0)

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, statusid, count(*)
from cte
where flag = 1 -- now remove those rows
group by item, statusid