Google bigquery BigQuery日志文件中每个用户最近的事件

Google bigquery BigQuery日志文件中每个用户最近的事件,google-bigquery,Google Bigquery,这必须是简单的,但它让我在BQ难住了 简单日志文件: mysql> select * from wow; +------+---------------+------------+ | id | string | epoch | +------+---------------+------------+ | id3 | a new user | 1400783480 | | id1 | a log event 1 | 1400783492 | | id

这必须是简单的,但它让我在BQ难住了

简单日志文件:

mysql> select * from wow;
+------+---------------+------------+
| id   | string        | epoch      |
+------+---------------+------------+
| id3  | a new user    | 1400783480 |
| id1  | a log event 1 | 1400783492 |
| id1  | a log event 2 | 1400783499 |  
| id1  | a log event 3 | 1400783503 |
| id2  | a log event 1 | 1400783510 |
| id2  | a log event 2 | 1400783516 |
+------+---------------+------------+
我想在BQ中执行等效操作,以查找每个Id的最后一个事件:

mysql> select * from (select * from wow as B order by epoch desc) as A group by id;
+------+---------------+------------+
| id   | string        | epoch      |
+------+---------------+------------+
| id1  | a log event 3 | 1400783503 |
| id2  | a log event 2 | 1400783516 |
| id3  | a new user    | 1400783480 |
+------+---------------+------------+
3 rows in set (0.00 sec)

非常感谢任何提示/帮助。

最简单的方法可能是使用GROUP BY和MIN进行查询,以找到所需的id、历元对,然后将其连接回原始表:

SELECT t.*
FROM 
    (SELECT id, MAX(epoch) AS max_epoch FROM [tmp.so1] GROUP BY id) AS keys 
  JOIN 
    [tmp.so1] AS t 
  ON keys.id = t.id AND keys.max_epoch = t.epoch 
ORDER BY t.id
对于您的数据而言,这确实是一种回报:

+------+---------------+------------+
| t_id |     t_msg     |  t_epoch   |
+------+---------------+------------+
| id1  | a log event 3 | 1400783503 |
| id2  | a log event 2 | 1400783516 |
| id3  | a new user    | 1400783480 |
+------+---------------+------------+
注三:

我使用了方便的t.*简写法来表示结果,但如果您需要原始名称,实际上可以将它们映射过来 如果您的表变大,您可能需要切换到一个JOIN-EACH。 在给定ID有多个具有最小历元的条目的情况下,将得到双倍的行。
我宁愿避免加入,因为有更优雅的方法可以做到这一点:

如果数据集不太大,请使用rownumber:

选择* 从…起 按epoc desc的id顺序选择*分区上的行号作为RNB 从t 其中RNB=1

对于较大的数据集,可以操纵maxtime和日志字符串,以fid每个用户的最后一个日志条目

按id分别从t组中选择id、子字符串MaxConcatStringEpoch、logstring和10

希望这对您有所帮助。

可能的副本