gpt4 book ai didi

mysql - 当值高于先前值时选择范围

转载 作者:可可西里 更新时间:2023-11-01 08:33:09 25 4
gpt4 key购买 nike

如何获取所有值高于先前值的记录。例如,下表中的第一个范围从 id 1 开始到 id 6 结束,下一个范围是从 7 到 10,等等...

id  Open
1 1.30077
2 1.30088
3 1.30115
4 1.30132
5 1.30135
6 1.30144
7 1.30132
8 1.30137
9 1.30152
10 1.30158
11 1.30149
12 ...

最佳答案

您的示例数据

USE test
DROP TABLE IF EXISTS rangedata;
CREATE TABLE rangedata
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
open FLOAT
) ENGINE=MyISAM;
INSERT INTO rangedata (open) VALUES
(1.30077),(1.30088),(1.30115),(1.30132),
(1.30135),(1.30144),(1.30132),(1.30137),
(1.30152),(1.30158),(1.30149),
(1.30077),(1.30088),(1.30115),(1.30132),
(1.30135),(1.30144),(1.30132),(1.30137),
(1.30152),(1.30158),(1.30149),
(1.30077),(1.30088),(1.30115),(1.30132),
(1.30135),(1.30144),(1.30132),(1.30137),
(1.30152),(1.30158),(1.30149);

您的示例数据已加载

mysql>     USE test
Database changed
mysql> DROP TABLE IF EXISTS rangedata;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE rangedata
-> (
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> open FLOAT
-> ) ENGINE=MyISAM;
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO rangedata (open) VALUES
-> (1.30077),(1.30088),(1.30115),(1.30132),
-> (1.30135),(1.30144),(1.30132),(1.30137),
-> (1.30152),(1.30158),(1.30149),
-> (1.30077),(1.30088),(1.30115),(1.30132),
-> (1.30135),(1.30144),(1.30132),(1.30137),
-> (1.30152),(1.30158),(1.30149),
-> (1.30077),(1.30088),(1.30115),(1.30132),
-> (1.30135),(1.30144),(1.30132),(1.30137),
-> (1.30152),(1.30158),(1.30149);
Query OK, 33 rows affected (0.00 sec)
Records: 33 Duplicates: 0 Warnings: 0

mysql>

使用连接查询

这是 LEFT JOIN 查询

SET @grp = 1;
SELECT A.open prev,(@grp:=@grp+IF(A.open<B.open,1,0)) group_number
FROM rangedata A LEFT JOIN rangedata B ON A.id= B.id+1;

这是它的输出

mysql> SELECT A.open prev,(@grp:=@grp+IF(A.open<B.open,1,0)) group_number
-> FROM rangedata A LEFT JOIN rangedata B ON A.id= B.id+1;
+---------+--------------+
| prev | group_number |
+---------+--------------+
| 1.30088 | 1 |
| 1.30115 | 1 |
| 1.30132 | 1 |
| 1.30135 | 1 |
| 1.30144 | 1 |
| 1.30132 | 2 |
| 1.30137 | 2 |
| 1.30152 | 2 |
| 1.30158 | 2 |
| 1.30149 | 3 |
| 1.30077 | 4 |
| 1.30088 | 4 |
| 1.30115 | 4 |
| 1.30132 | 4 |
| 1.30135 | 4 |
| 1.30144 | 4 |
| 1.30132 | 5 |
| 1.30137 | 5 |
| 1.30152 | 5 |
| 1.30158 | 5 |
| 1.30149 | 6 |
| 1.30077 | 7 |
| 1.30088 | 7 |
| 1.30115 | 7 |
| 1.30132 | 7 |
| 1.30135 | 7 |
| 1.30144 | 7 |
| 1.30132 | 8 |
| 1.30137 | 8 |
| 1.30152 | 8 |
| 1.30158 | 8 |
| 1.30149 | 9 |
| 1.30077 | 9 |
+---------+--------------+
33 rows in set (0.01 sec)

没有连接的查询

使用用户定义的变量,您只需监视每一行并查看前一个值何时更大。准备好查询了吗?在这里:

SET @prev = '0.00000';
SET @grp = 1;
SELECT id,open,(@grp:=@grp+increasing) group_number FROM
(SELECT id,open,IF(@prev<=open,0,1) increasing,(@prev:=open) FROM rangedata) A;

这是您的样本数据的三倍:

这是查询的执行:

mysql> SET @prev = '0.00000';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @grp = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT id,open,(@grp:=@grp+increasing) group_number FROM
-> (SELECT id,open,IF(@prev<=open,0,1) increasing,(@prev:=open) FROM rangedata) A;
+----+---------+--------------+
| id | open | group_number |
+----+---------+--------------+
| 1 | 1.30077 | 1 |
| 2 | 1.30088 | 1 |
| 3 | 1.30115 | 1 |
| 4 | 1.30132 | 1 |
| 5 | 1.30135 | 1 |
| 6 | 1.30144 | 1 |
| 7 | 1.30132 | 2 |
| 8 | 1.30137 | 2 |
| 9 | 1.30152 | 2 |
| 10 | 1.30158 | 2 |
| 11 | 1.30149 | 3 |
| 12 | 1.30077 | 4 |
| 13 | 1.30088 | 4 |
| 14 | 1.30115 | 4 |
| 15 | 1.30132 | 4 |
| 16 | 1.30135 | 4 |
| 17 | 1.30144 | 4 |
| 18 | 1.30132 | 5 |
| 19 | 1.30137 | 5 |
| 20 | 1.30152 | 5 |
| 21 | 1.30158 | 5 |
| 22 | 1.30149 | 6 |
| 23 | 1.30077 | 7 |
| 24 | 1.30088 | 7 |
| 25 | 1.30115 | 7 |
| 26 | 1.30132 | 7 |
| 27 | 1.30135 | 7 |
| 28 | 1.30144 | 7 |
| 29 | 1.30132 | 8 |
| 30 | 1.30137 | 8 |
| 31 | 1.30152 | 8 |
| 32 | 1.30158 | 8 |
| 33 | 1.30149 | 9 |
+----+---------+--------------+
33 rows in set (0.00 sec)

关键点是:每次出现新的组号时,都会告诉您下一个掉落的值。

请注意两个查询的输出是相同的

警告:如果 prevopen 之间存在一些浮点问题,第二个查询不是完美的解决方案。如果它们彼此离谱地接近,则可能是不对的。这是编写存储过程之外的最佳尝试。

关于mysql - 当值高于先前值时选择范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20982722/

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