与MYSQL中的旧条目相比,是否有一种按值增加排序的方法?

与MYSQL中的旧条目相比,是否有一种按值增加排序的方法?,mysql,sql,subquery,sql-order-by,Mysql,Sql,Subquery,Sql Order By,我想在三天内按百分比增加订购每个ID。如果三天前没有条目,则应将日期上移到今天的日期。在下文中,我解释了数据库环境的布局 我在MYSQL中有一个表,其结构如下(注意:ID列不是唯一的) 每天都会为n个ID插入新值。然后,该表将有点像这样: 身份证件 价值 日期 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

我想在三天内按百分比增加订购每个ID。如果三天前没有条目,则应将日期上移到今天的日期。在下文中,我解释了数据库环境的布局

我在MYSQL中有一个表,其结构如下(注意:ID列不是唯一的)

每天都会为n个ID插入新值。然后,该表将有点像这样:

身份证件 价值 日期 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
这有点棘手,因为MySQL没有“first”/“last”聚合函数。一种方法使用窗口函数:

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+。是一个dbfiddle。

必须仔细阅读分区,并添加WHERE子句来说明时间范围,但这个示例非常有效。谢谢。
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;