按條件查出兩條記錄後求其位置間隔

xiaohuihui發表於2020-06-12

資料排序以後,按照查詢條件找到需要的兩條記錄,然後算出這兩條記錄之間間隔了多少條記錄。

用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也能很方便地嵌入到JAVA應用,可參考 。

具體使用方法可參考 。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2698009/,如需轉載,請註明出處,否則將追究法律責任。

相關文章