Select BigQuery 基于时间戳的最新 N 条记录 - 更优化

Select latest N records in BigQuery based on TimeStamp - More Optimized

我想根据时间戳列选择最新的 2 记录,比方说执行分析。 实际上我有一个庞大的数据集,我想为我的每个 user_n.

选择 n 记录

如果我可以对值进行硬编码,那就没问题了。

SELECT * 
FROM
  `project-id`.huge-dataset-id.streaming-data`
WHERE timestamp_column BETWEEN '2015-06-10 14:20' AND '2015-06-10 14:30'

但必须制定dynamic.I我没有那么强SQL和BigQyery.Please帮助

我需要最新的N条记录

已尝试 -(工作解决方案),需要更优化的解决方案。

SELECT *
  FROM (
    SELECT *
    FROM `project-id`.`dataset`.`streaming_data` s1
    WHERE (
        SELECT COUNT(*)
        FROM `project-id`.`dataset`.`streaming_data` s2
        WHERE s1.user_n = s2.user_n
            AND s1.timestamp_col <= s2.timestamp_col
    ) <= 2
  ) 

由于嵌套查询过多,运行速度很慢。 有人可以提供优化的解决方案吗?

数据 Table 为 streaming_data

-------------------------------
| user_n  | timestamp_column  |
|-----------------------------|
| ABC     | 10-Jun-12 14.30   |
| DEF     | 10-Jun-12 14.30   |
| ABC     | 10-Jun-12 14.20   |
| DEF     | 10-Jun-12 14.20   |
| ABC     | 10-Jun-12 14.10   |
| DEF     | 10-Jun-12 14.10   |
| ABC     | 10-Jun-12 14.00   |
| DEF     | 10-Jun-12 14.00   |

预期输出:所有用户的最新 2 条记录,基于最新的时间戳

-------------------------------
| user_n  | timestamp_column  |
|-----------------------------|
| ABC     | 10-Jun-12 14.30   |
| DEF     | 10-Jun-12 14.30   |
| ABC     | 10-Jun-12 14.20   |
| DEF     | 10-Jun-12 14.20   |

使用row_number()。例如,获取最近的记录:

SELECT sd.* EXCEPT (seqnum)
FROM (SELECT sd.*,
             ROW_NUMBER() OVER (PARTITION BY user_n ORDER BY timestamp_column DESC) as seqnum
      FROM `project-id`.huge-dataset-id.streaming-data` sd
      WHERE timestamp_column BETWEEN '2015-06-10 14:20' AND '2015-06-10 14:30'
     ) sd
WHERE seqnum <= 2;

如果您想要随机两行,请改用 ORDER BY rand()

包含时间戳范围,因为它在问题中。但是,要获取最近的两行,您可以将其删除。