SQL 如何查詢連續上漲 N 次的記錄
用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 查詢SQL Server的歷史執行記錄SQLServer
- SQL連線查詢SQL
- SQL實戰從在職到離職(1) 如何處理連續查詢SQL
- 記錄一次遞迴查詢的運用遞迴
- 挺有意思:PHP 將N秒內連續的記錄視為一條記錄PHP
- Mybatis 中將 SQL 查詢記錄到控制檯MyBatisSQL
- MongoDB隨機查詢返回一條或N條記錄的方法MongoDB隨機
- SQL:查詢每個類別最新的5條記錄SQL
- sql 連線查詢例項(left join)三表連線查詢SQL
- windbg分析一次大查詢導致的記憶體暴漲記憶體
- sql根據多個欄位查詢重複記錄SQL
- SQL連續查詢問題擴充—記上海拼多多非技術崗面試真題SQL面試
- 記錄netcore一次記憶體暴漲的坑NetCore記憶體
- 一個SQL查詢連續三天的流量100以上的資料值【SQql Server】SQLServer
- sql查詢是如何執行的?SQL
- SQL查詢的:子查詢和多表查詢SQL
- Laravel 框架使用 whereIn 查詢 SQL 時資料出錯記錄Laravel框架SQL
- 在檔案上使用 SQL 查詢的示例SQL
- MongoDB 如何支援類 SQL 查詢MongoDBSQL
- 如何查詢上標
- mysql 隨機查詢記錄MySql隨機
- Spring Data Jpa 的簡單查詢多表查詢HQL,SQL ,動態查詢, QueryDsl ,自定義查詢筆記SpringSQL筆記
- 記錄一下使用左關聯的一次查詢(可樂的筆記)筆記
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- Java 中如何使用 SQL 查詢 TXTJavaSQL
- 記一個實用的sql查詢語句SQL
- 【記錄】SSH分頁查詢功能
- 使用SSMS連線和查詢 SQL Server 例項SSMSQLServer
- T-SQL——關於跨庫連線查詢SQL
- SQL Sever 實現查詢超過自己經理工資的員工(自連線查詢)SQL
- 原生SQL查詢SQL
- SQL--查詢SQL
- SQL 聚合查詢SQL
- mysql 查詢記錄數大於一千萬的表MySql
- 查詢當天的系統訂單記錄
- 秒級查詢之開源分散式SQL查詢引擎Presto實操-上分散式SQLREST
- 記錄一次在keil中,查詢ALIGN()括號裡任意字元,ALIGN(.*)字元
- cmdb 查詢資料庫操作記錄資料庫