首页 > 应用开发 > IT综合 > 按条件查出两条记录后求其位置间隔
数据排序以后,按照查询条件找到需要的两条记录,然后算出这两条记录之间间隔了多少条记录。
用SQL来求这个解比较麻烦!
SQL的集合中没有记录顺序,不能提供记录的位置信息。SQL2003标准中加入了窗口函数,能够给记录添加行号了,解决这个问题就需要先添加行号,然后再用多次子查询定位计算。
举个例子:现有股票收盘价数据表STOCK数据如下,要求查出股票000062最后的最低收盘价和最后的最高收盘价之间相隔多少个交易日:
| CODE | STOCKDATE | CLOSE |
| 000062 | 2019-01-02 | 8.11 |
| 000062 | 2019-01-03 | 8.31 |
| 000062 | 2019-01-04 | 8.76 |
| … | … | … |
| 000062 | 2019-12-30 | 7.32 |
| 000062 | 2019-12-31 | 7.12 |
| … | … | … |
以Oracle为例,用SQL写出来是这样:
WITH T AS
(SELECT *, ROW_NUMBER() OVER (ORDER BY STOCKDATE) RN FROM STOCK WHERE CODE='000062'),
T1 AS (SELECT * FROM T WHERE CLOSE = ( SELECT MIN(CLOSE) FROM T )),
T2 AS (SELECT * FROM T WHERE CLOSE = ( SELECT MAX(CLOSE) FROM T )),
T3 AS (SELECT * FROM T1 WHERE RN = ( SELECT MAX(RN) FROM T1 )),
T4 AS (SELECT * FROM T2 WHERE RN = ( SELECT MAX(RN) FROM T2 ))
SELECT ABS(MAX(T3.RN)-MAX(T4.RN)) FROM T3, T4;
这个SQL子查询很多,可读性不太好。
如果用集算器的SPL语言来解决这个问题,就会简单很多,只需2行代码:
|
|
A |
| 1 | =connect("mydb").query("select * from stock where code=’000062’ order by stockdate") |
| 2 | =abs(A1.pmin@z(CLOSE)-A1.pmax@z(CLOSE)) |
SPL语言支持有序集合对象,提供了返回记录在集合中位置的函数,所以解决这个问题的思路就非常自然,读者一看就明白了。
SPL 集合还提供了交、差、并运算,聚合运算,循环遍历运算,请阅 《SPL教案 集合》、 《SPL教案 有序》。
SPL也能很方便地嵌入到JAVA应用,可参考 《Java 如何调用 SPL 脚本》。
具体使用方法可参考 《如何使用集算器》。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69900830/viewspace-2698009/ ,如需转载,请注明出处,否则将追究法律责任。