Google bigquery BigQuery日志文件中每个用户最近的事件
这必须是简单的,但它让我在BQ难住了 简单日志文件: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
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 希望这对您有所帮助。可能的副本