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_date
或 event_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.
我在 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_date
或 event_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.