与 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.
我想按三天时间范围内增加的百分比对每个 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.