>我有一个看起来像这样的表格
+----+------------+------+
| 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
排序(。
确定序列,ID
是session_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 |
+------------+------+-------+
您可以使用id
和row_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)