gpt4 book ai didi

mysql - 根据 MySQL 中的时间戳列选择距离相等的行

转载 作者:行者123 更新时间:2023-11-29 08:25:47 24 4
gpt4 key购买 nike

如何从表中选择固定数量的行,其中时间戳列和返回行彼此距离相等。我需要这些点作为样本点来绘制时间序列。我知道解决此问题的其他技术,例如交叉过滤器等,但我现在希望能够使用服务器。

例如,下表:(为了清楚起见,简化了时间戳)

id    key    val   timestamp
1 'a' 100 1am
2 'b' 120 2am
3 'c' 130 3am
4 'd' 140 4am
5 'e' 130 5am
6 'f' 135 6am
7 'g' 136 7am
8 'h' 139 8am
9 'i' 149 9am
10 'j' 140 10am
11 'k' 140 11am
12 'l' 135 12pm

因此,我希望能够运行一个查询,该查询将返回大小为 3 的样本,例如,它应该返回第 1、5 和 9 行。

我不想使用 id,因为我的表比这更复杂,并且我将在查询中应用 where 子句等,因此使用 ID 是行不通的。

通过与其他 RDBS 的合作,我知道 RANK,但它似乎不存在于 mysql 中,我看到了解决方法,例如 here ,但我不认为这是编写 mysql 的干净方法。

关于如何解决这个问题有什么建议吗?

最佳答案

您可能需要 step function将您的时间戳映射到一组有限的“步骤”。这在 MySQL 中可以这样表达:

--
-- `min_v` and `max_v` are respectively the first and last value value on the range
-- `samples` is the number of sample ("steps") expected
-- `value` is the actual value
--
CREATE FUNCTION step(min_v int, max_v int, samples int, value int)
RETURNS int DETERMINISTIC
RETURN min_v + (value - min_v) * (samples - 1) DIV (max_v-min_v)

为了简单起见,我在这里使用整数而不是时间戳。您可以在 MySQL 文档中轻松找到如何 convert from timestamps to "unix epoch" .

定义函数后,您只需在选择查询中按“步骤”进行分组,仅保留每个步骤的第一个样本:

select data.k, data.value FROM tbl AS data
join (select id, MIN(ts) FROM tbl GROUP BY step(1,12,4,ts) ) as s
on s.id = data.id;

参见http://sqlfiddle.com/#!2/d5ccb/3举个例子。

关于mysql - 根据 MySQL 中的时间戳列选择距离相等的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17981024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com