SQL 如何查詢連續上漲 N 次的記錄

xiaohuihui發表於2020-06-18

用SQL如何查詢連續上漲N次的記錄?

這個問題用SQL來做很難!

SQL的理論基礎是無序集合,早期SQL也沒有次序的概念,需要用JOIN造出次序,連續上漲這種問題就非常困難。後來在SQL2003標準中加入了視窗函式,一定程度地緩解了這個問題,但解決連續上漲問題仍然並不輕鬆。

舉個例子:查詢連續n天上漲的股票,現有資料庫表stock資料如下:

code stockdate close
000062 2015-01-05 8.91
000062 2015-01-06 8.31
000062 2015-01-07 7.6
000062 2015-01-08 7.93
000062 2015-01-09 7.72

如果查詢連續3天上漲的股票,用SQL寫出來是這樣:

WITH A AS

       (SELECT CODE,STOCKDATE,(CLOSE-LAG(CLOSE) OVER (PARTITION BY CODE ORDER BY STOCKDATE) )CLOSE_UP FROM STOCK),

B AS

       (SELECT CODE,

              CASE WHEN CLOSE_UP>0 AND

                     LAG(CLOSE_UP) OVER (PARTITION BY CODE ORDER BY STOCKDATE)>0 AND

                     LAG(CLOSE_UP,2) OVER (PARTITION BY CODE ORDER BY STOCKDATE)>0

                     THEN 1 ELSE 0 END UPDAYS3 FROM A)

SELECT DISTINCT CODE FROM B WHERE UPDAYS3=1

這裡把3天寫死進去了,要查詢連續5天就會更復雜, n天就不知道怎麼寫。

 

對於這種有序的運算,如果使用集算器的SPL語言就會簡單很多,只需2行程式碼:


A
1 =connect("mydb").query("select   * from stock order by code, stockdate").group@o(code)
2 =A1.select((a=0,~.pselect((a=if(close>close[-1],a+1,0))>=5))>0).(code)

如果要查詢n天,只要把A2中的5改成n即可。

 

SPL基於有序集合實現,對有序計算的支援比較徹底,能清楚表述集合中任意位置的記錄,透過絕對/相對位置定位,很容易計算股票每日漲跌。

有序集合除了定位計算,還有非常規迭代聚合、有序迴圈、有序排名等多種計算手段,參考 , ,這些技術對簡化計算程式設計很有幫助。

集算器 SPL 是解決 SQL 難題的專業指令碼語言,它語法簡單,符合自然思維,是天然分步、層次清晰的程式導向計算語言。它採用與資料庫無關的統一語法,編寫的演算法可在資料庫間無縫遷移。它是桌面級計算工具,即裝即用,配置簡單,除錯功能完善,可設定斷點、單步執行,每步執行結果都可檢視。請參閱

SPL也能很方便地嵌入到JAVA應用,可參考 。

具體使用方法可參考 。

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

相關文章