BigQuery / 计算行数,直到达到特定行 2

BigQuery / Count the number of rows until a specific row is reached 2

我在 BigQuery 中有数据。

我想计算每个 ID 在 'approved' 事件之前的 'pending' 事件数。

注意。如果ID没有'approved',那这组事件就不应该被统计(见最后两行)

如何获取每个 ID 的值?

Table 事件

id  event
1   pending
1   pending
1   pending
1   approved
2   pending
1   pending
1   pending
1   approved
2   approved
1   pending 
1   pending

在这个例子中正确的结果是

id  count_events
1   3
1   2
2   1

我确实没有足够的信息来编写准确的查询,但您可以使用 GROUP BY 和 COUNT

SELECT * FROM (
SELECT id, event, COUNT(event)
FROM 'table'
GROUP BY id, event)
WHERE event <> 'approved'

正如@Schwern 所指出的,如果您没有专栏让您了解事件的顺序,您将无法获得预期的结果。

也就是说,如果您有 event_dateevent_timestamp 列,这里有一个解决方案:


WITH temp AS(
  SELECT
    id,
    event,
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY event_date) AS rownum
  FROM
    sample )
SELECT
  id,
  event,
  rownum-COALESCE(LAG(rownum) OVER(PARTITION BY id ORDER BY rownum), 0)-1 AS count_events
FROM
  temp
WHERE
  event = 'approved'
  

使用您提供的数据,它 returns 所需的输出:

查询背后的逻辑是说 'approved' 之前的 'pending' 计数是 'approved' 的位置(它的行号)减去前一个 [=24] 的位置=] 减 1.