对表中序列中相同的行进行计数



>我有一个看起来像这样的表格

+----+------------+------+
| ID | Session_ID | Type |
+----+------------+------+
|  1 |          1 |    2 |
|  2 |          1 |    4 |
|  3 |          1 |    2 |
|  4 |          2 |    2 |
|  5 |          2 |    2 |
|  6 |          3 |    2 |
|  7 |          3 |    1 |
+----+------------+------+

我想计算一个序列中type的所有出现次数。

输出看起来像这样:

+------------+------+-----+
| Session_ID | Type | cnt |
+------------+------+-----+
|          1 |    2 |   1 |
|          1 |    4 |   1 |
|          1 |    2 |   1 |
|          2 |    2 |   2 |
|          3 |    2 |   1 |
|          3 |    1 |   1 |
+------------+------+-----+

一个简单的group by,比如

SELECT session_id, type, COUNT(type)
FROM table
GROUP BY session_id, type

不起作用,因为我只需要对"触摸"的行进行分组。

这可以通过合并 sql 选择来实现,还是我需要某种编码。存储过程还是应用程序端编码?

更新顺序:
如果下一行具有相同的type,则应对其进行计数(按ID排序(。

确定序列,IDsession_ID键,因为我只想对具有相同session_ID的行进行分组。

所以如果有 3 行在一个会话中

  • ID 为 1 的行的类型为 1,
  • 第二行有类型 1
  • 第 3 行具有类型 2

输入:

+----+------------+------+
| ID | Session_ID | Type |
+----+------------+------+
|  1 |          1 |    1 |
|  2 |          1 |    1 |
|  3 |          1 |    2 |
+----+------------+------+

顺序是第 1 行到第 2 行。这三行应该输出

输出:

+------------+------+-------+
| Session_ID | Type | count |
+------------+------+-------+
|          1 |    1 |     2 |
|          3 |    2 |     1 |
+------------+------+-------+

您可以使用idrow_number()的差异来确定差距,然后执行计数

;with cte as
(
Select *, id - row_number() over (partition by session_id,type order by id) as grp 
from table
)
select session_id,type,count(*) as cnt
from cte
group by session_id,type,grp 
order by max(id) 

相关内容

  • 没有找到相关文章

最新更新