sql - 如何在特定事件之前对组中的事件进行计数

标签 sql postgresql string-function

假设我有如下表格:

\d events 
    Table "public.events
   Column   |           Type           | Modifiers 
------------+--------------------------+-----------
 my_id      | bigint                   | 
 tstamp     | timestamp with time zone | 
 event_type | text                     | 

使用示例数据:

   my_id     |           tstamp           | event_type 
------------+----------------------------+------------
 1111111111 | 2015-11-14 09:02:46.185+02 | A
 1111111111 | 2015-11-14 17:32:58+02     | B
 1111111111 | 2015-11-28 15:06:30.895+02 | A
 1111111111 | 2015-12-05 15:22:31.582+02 | A
 2222222222 | 2015-11-17 15:06:07.481+02 | A
 2222222222 | 2015-11-17 20:30:03+02     | B
 2222222222 | 2015-12-04 15:36:31.532+02 | A
 3333333333 | 2015-11-20 15:06:01.621+02 | A
 3333333333 | 2015-11-20 19:15:09.908+02 | A
 3333333333 | 2015-11-21 15:06:01.621+02 | A
 3333333333 | 2015-11-26 09:07:45.134+02 | B
 3333333333 | 2015-11-27 14:39:31.657+02 | A
 4444444444 | 2015-12-05 10:21:21.441+02 | A
 4444444444 | 2015-12-05 20:00:40.772+02 | B

我想计算事件 B 之前每个 my_id 的所有事件 A。

预期的输出是:

   my_id   | events_before_B 
-----------+-----------------
1111111111 | 1
2222222222 | 2
3333333333 | 3
4444444444 | 1

Postgres 版本 9.4

最佳答案

SELECT my_id
      ,position('B' IN string_agg(event_type, '')) - 1 events_before_B
FROM events
GROUP BY my_id
ORDER BY my_id

SQLFIDDLE-DEMO


解释:

string_agg()

select my_id,string_agg(event_type,'') from events group by my_id产量

my_id      string_agg 
---------- ---------- 
1111111111 ABAA       
2222222222 ABA        
3333333333 AAABA      
4444444444 AB   

position()

select position('B' in 'AAABAA')可以用来找出B的位置在字符串中 AAABAA

position 
-------- 
4    

所以 select position('B' in 'AAABAA')-1产生 A 的位置就在B之前

position 
-------- 
3

关于sql - 如何在特定事件之前对组中的事件进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34198729/

相关文章:

MySQL 分隔符错误

mysql - 在子查询中重用联接表

MySQL:更新列 WHERE 列以 ""开始(空格)

javascript - 带有空searchString的startsWith字符串方法

postgresql - 如何找到字符串中第n个位置的字符

mysql - sql查询错误,

使用 MyBatis 的 SQL 异常

sql - 根据另一列的值更新列

python - 库未加载 : libssl. 1.0.0.dylib 原因:找不到图像

postgresql - 使用 gorm 从两个表中选择