我有一个表,其中包含一些带有 Unix 时间戳的值。
数据的频率是可变的,但通常在每分钟一个数据点左右。 我想在不聚合的情况下使用自定义频率设置对数据进行采样。例如,我想每 15 分钟最多获取一个数据点。
这是一个例子:
row dt dt_parsed value
1 1684449236166 2023-05-18 22:33 241.0
2 1684449854529 2023-05-18 22:44 240.0
3 1684450070779 2023-05-18 22:47 240.0
4 1684450684766 2023-05-18 22:58 241.0
5 1684450868360 2023-05-18 23:01 241.0
6 1684451027112 2023-05-18 23:03 241.0
7 1684452361787 2023-05-18 23:26 241.0
以15分钟为频率,我想得到的:
row dt dt_parsed value
1 1684449236166 2023-05-18 22:33 241.0 --> nearest point to 22:30
2 1684449854529 2023-05-18 22:44 240.0 --> nearest point to 22:45
5 1684450868360 2023-05-18 23:01 241.0 --> nearest point to 23:00
6 1684451027112 2023-05-18 23:03 241.0 --> nearest point to 23:15
7 1684452361787 2023-05-18 23:26 241.0 --> nearest point to 23:30
我正在使用 Impala/Hive 查询数据。
您可以使用
floor()
函数将 Unix 时间戳四舍五入到最接近的所需时间间隔:
SELECT
row,
dt,
dt_parsed,
value
FROM
your_table
WHERE
dt IN (
SELECT
dt
FROM (
SELECT
dt,
ROW_NUMBER() OVER (PARTITION BY floor(dt / (15 * 60 * 1000)) ORDER BY dt) AS row_number
FROM
your_table
) subquery
WHERE
row_number = 1
)
ORDER BY
dt;