SQL 如何返回最大值所在的多條記錄
SQL 中透過 top 或 limit 子句得到第一條資料不難,再配合排序,就能得到最大的那一行:
select top 1 * from T order by f desc
如果最大值有多條記錄,想全部得到,就需要子查詢得到最大值,然後二次遍歷資料得到和最大值相同的所有記錄:
select * from T where f=(select max(f) from T)
或用視窗函式 rank() 做一下排名,然後取第 1 名:
select * from (select T.*,rank()over(partition by 1 order by age desc) f_rank from T) where f_rank=1
無論如何都要分成兩步才能得到結果。試想我們去海邊撿最大的貝殼,一邊走一邊比對就行了,始終保留最大的,同樣大的就都留在手裡,這很自然。但 SQL 表達能力有限,沒有保留多個最大的能力,只能來回走兩趟,這種繞遠的解題思路如果再巢狀幾層,將會給程式設計師帶來很大的理解負擔。
這種情況如果用集算器 SPL 語言就比較容易,從資料庫得到原始資料:
>T=connect(”mysqlDB”).query(“select * from T”)
然後用 maxp 的 @a 選項,就能取出全部的最大值記錄了:
=T.maxp@a(f)
上面這個用法是個小改善,SQL 裡還有更多彆扭、思維方式很繞的計算,根源在於 SQL 依賴的關係代數體系不支援有序集合計算,無法利用資料在集合中的位置,沒有平衡好集合與離散資料的關係。SPL 在做有序集合計算時,對 SQL 裡的 TopN 進行了變種,可以取 TopN 的值 / 記錄 / 記錄在集合中的位置,以應對更廣泛的計算需求;可以應用到分組子集,增強分組後續操作的能力,參考
集算器 SPL 是解決 SQL 難題的專業指令碼語言,它語法簡單,符合自然思維,是天然分步、層次清晰的程式導向計算語言。它採用與資料庫無關的統一語法,編寫的演算法可在資料庫間無縫遷移。它是桌面級計算工具,即裝即用,配置簡單,除錯功能完善,可設定斷點、單步執行,每步執行結果都可檢視。請參閱
當資料不在資料庫裡時,SPL 載入資料仍然方便:
=file(“d:/t.csv”).import(;,",")
SPL能很方便地嵌入到JAVA應用,可參考 。
具體使用方法可參考 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2699325/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mybatis一對多查詢resultMap只返回了一條記錄MyBatis
- MongoDB隨機查詢返回一條或N條記錄的方法MongoDB隨機
- 反連線,最快返回第一條記錄
- sql取前幾條記錄SQL
- 用record型別和table型別儲存查詢語句返回的多條記錄 的例子型別
- SQL 單表多條記錄分組查詢分頁程式碼SQL
- MySQL:使用INSERT 插入多條記錄MySql
- postgresql 多條記錄合併一條,或取最新的一條資料SQL
- C# ling to sql 取多條記錄最大時間的例項程式碼C#SQL
- 從資料庫返回多條紀錄賦值給shell變數資料庫賦值變數
- SQL 分組排序取最新一條記錄SQL排序
- SQL 獲取插入後的最新一條記錄ID號SQL
- sql server 中刪除內容重複的某條記錄SQLServer
- SQL:查詢每個類別最新的5條記錄SQL
- oracle單條sql與plsql rowid插入記錄小記OracleSQL
- sql刪除重複記錄只保留一條SQL
- 判斷符合條件記錄是否存在SQL若干SQL
- mysql語句:批量更新多條記錄的不同值[轉]MySql
- SQL Server一行多列求最大值SQLServer
- NHibernate使用ICriteria分頁並返回資料庫記錄總條數資料庫
- sql刪除一條記錄後其他記錄的id自動遷移,使id連續SQL
- python-max()返回最大值Python
- SQL Server 函式返回多個值SQLServer函式
- SQL多條件查詢SQL
- 瀏覽器歷史記錄的返回瀏覽器
- Laravel 一條 SQL 如何 count 多個欄位,Laravel 一條 sql 查詢每個分類的數量LaravelSQL
- C# DataTable中返回列中的最大值C#
- 如何分析一條sql的效能SQL
- oracle分組查詢獲得組的最大值記錄Oracle
- v$sql_shared_cursor檢視記錄多版本的資訊SQL
- sql 多組條資料取最新的一條資料SQL
- MySql先分組統計總記錄數,再獲取記錄數中的最大值MySql
- 如何最佳化查詢記錄數的SQL操作?SQL
- mysql 批次更新與批次更新多條記錄的不同值實現方法MySql
- 怎樣Oracle把多條記錄的相同欄位拼成一個字串Oracle字串
- 使用Spring JDBC新增記錄如何返回自增主鍵值SpringJDBC
- Vue 返回記住滾動條位置詳解Vue
- SQL 如何查詢連續上漲 N 次的記錄SQL