与MYSQL中的旧条目相比,是否有一种按值增加排序的方法?
我想在三天内按百分比增加订购每个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中的旧条目相比,是否有一种按值增加排序的方法?,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
这有点棘手,因为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;