与 MYSQL 中的旧条目相比,有没有办法按价值增加进行排序?

Is there a way to order by value increase compared to older entries in MYSQL?

我想按三天时间范围内增加的百分比对每个 ID 进行排序。如果三天前没有条目,它应该将日期上移到今天的日期。下面我已经解释了数据库环境的布局。

我在 MYSQL 中有一个具有以下结构的 table(注意:ID 列不是唯一的。)。

CREATE TABLE test (
  ID INT(3) NOT NULL,
  value INT(3) NOT NULL,
  date DATE NOT NULL
);

每天都会插入 n 个 ID 的新值。 table 看起来像这样:

ID value date
1 4 2020-12-08
1 4 2020-12-07
1 7 2020-12-06
1 5 2020-12-05
2 10 2020-12-08
2 8 2020-12-07
2 7 2020-12-06
3 10 2020-12-08
4 10 2020-12-08

对于此示例,SQL 查询应 return 以下顺序。 ID 2的涨幅最大,所以第一,其次是没有涨幅,最后是跌幅。

ID value [current] / value [3 days ago]
2 10 / 7 = 1.43
3 10 / 10 = 1
4 7 / 7 = 1
1 4 / 7 = 0.57

希望我的逻辑是正确的。我尝试使用以下查询,但是这仅在子查询 return 只有一个它们不应该的结果时有效。

SELECT
  (SELECT value from test GROUP BY ID ORDER BY date DESC) AS 'first',
  (SELECT value from test WHERE date >= DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY) GROUP BY ID ORDER BY date ASC) AS 'last'

这里是 Fiddle 的例子:http://sqlfiddle.com/#!9/ded7c92/2

这是我工作中不可或缺的一部分,如有任何帮助,我们将不胜感激。

这有点棘手,因为 MySQL 没有“第一个”/“最后一个”聚合函数。一种方法使用 window 函数:

select id, oldest_value, newst_value
from (select t.*,
             row_number() over (partition by id order by date) as seqnum,
             first_value(value) over (partition by id order by date) as oldest_value,
             first_value(value) over (partition by id order by date desc) as newest_value
      from test t
     ) t
where seqnum = 1
order by newest_value / oldest_value;

这需要 MySQL 8+。 Here 是一个 db<>fiddle.