如何用 esProc 補充數據庫 SQL 的缺失能力

某些數據庫 SQL 缺失必要的能力,通常要編寫大段的代碼,才能間接實現類似的功能,有些情況甚至要改用存儲過程,連結構都變了。常見的比如:生成時間序列、保持分組子集、動態行列轉換、自然序號、相對位置、按序列和集合生成多條記錄、累積計算、條件分組、跨庫計算、集合計算、序列計算、自關聯結構、遞歸計算、對齊式關聯等。用下面幾個例子快速感受一下。

生成時間序列:某庫表的 Time 字段是時間,時間的間隔有時大于 1 分鐘。

TimeValue
10:10:053
10:11:064
10:13:135
10:13:199
10:13:328
10:14:352

現在要將數據每分鐘分成一個窗口,補上缺失的窗口,對每個窗口統計 4 個值:前一個窗口的最后一條 start_value;本窗口的最后一條;本窗口的最小值;本窗口的最大值。第一分鐘的 start_value 用本窗口的第一條記錄;如果缺少某窗口的數據,則用前一個窗口的最后一條代替。

startendstart_valueend_valueminmax
10:10:0010:11:003333
10:11:0010:12:003444
10:12:0010:13:004444
10:13:0010:14:004859
10:14:0010:15:008222

很多數據庫的 SQL 沒有方便的方法生成月份序列,很多數據庫要用多層嵌套查詢 + 多個窗口函數才能間接實現。

保持分組子集:某表存儲多個賬號在多個日期發生的事件。

RowAccount NumberDate
110012011-01-10
210012011-02-01
310012011-02-20
410012011-02-22
520012011-04-11
620012012-01-01
720012012-01-30
820012012-02-09

現在要找出每個賬號下符合條件的一對事件,分別是:日期最早的事件 a、距 a 事件 30 天以上的事件中日期最早的事件 b。

RowAccount NumberDate
110012011-01-10
310012011-02-20
520012011-04-11
620012012-01-01

SQL 分組后必須立刻匯總,很難按條件 b 篩選記錄,只能用 join 語句配合多個 CTE 子句間接實現。

動態行列轉換:某庫表記錄了不同產品每個月的銷售額,其中產品的值未知。

productmonthamount
AA1100
AA1150
AA2200
AA2120
BB2180
BB2220
CC380

現在要對產品、月份分組,對銷售額求和,再將產品由行轉列。

monthAABBCC
1250
2320400
380

某些數據庫的 SQL 缺失動態行列轉換能力,行轉列時必須寫出列名,很多數據庫只能改用存儲過程。

esProc SPL 內置豐富的計算類庫,可以補充這些數據庫 SQL 缺失的能力,比如上面 3 個例子:

"https://c.raqsoft.com.cn/article/1742353802112"


“@從 SQL 到 SPL:計算組內符合條件的一對最小值 - 乾學院”

“從 SQL 到 SPL:Create columns from distinct values of a column - 乾學院”

下面,我們就來嘗試一下如何將 esProc 集成到應用中。

先下載 esProc,推薦標準版:集算器 產品下載 | 報表加速器下載-半結構化計算軟件下載

下載并安裝相應的版本。

安完后,試一下 esProc IDE 是否可以正常訪問數據庫。先把數據庫的 JDBC Driver 放到目錄 "[安裝目錄]\common\jdbc",這是 esProc 的類路徑之一。比如 mySQL 的 JDBC:

Picture1png


打開 esProc IDE,找到菜單 "Tool->Connect to Data Source",新建 JDBC 數據源,填入具體數據庫的連接信息。下面是一個 mySQL 的數據源:

Picture2png


返回到數據源界面,試著連接數據源,跨庫運算時可以同時連接多個數據源。如果數據源名變成粉色,說明配置成功。

Picture3png


在 IDE 中新建腳本,寫 SPL 語句,連接 mysql 數據庫,加載第 1 個例子的數據:

=connect("mysql").query@x("select * from main")

按 ctrl-F9 執行,可以在 IDE 右邊看到執行結果,以數據表的形式呈現,這對調試 SPL 代碼很方便。

Picture4png

加載數據正常后,就可以寫正式的 SPL 代碼了,第 1 個例子:

 A
1=connect("mysql").query@x("select * from main where time>? and time<=?",arg1,arg2)
2=A1.run(Time=time@m(Time))
3=list=periods@s(A2.min(Time),A2.max(Time),60)
4=A2.align@a(list,Time)
5=A4.new(list(#):start, elapse@s(start,60):end, sv=ifn(end_value[-1],~.Value):start_value, ifn(~.m(-1).Value, sv):end_value, ifn(~.min(Value),sv):min, ifn(~.max(Value),sv):max)

先用參數過濾;再將時間改為整分鐘數;生成連續分鐘的時間序列;將數據按時間序列對齊,每組數據對應一分鐘的窗口;按要求用每組數據生成一條新記錄。

把上面腳本保存在某個目錄中,比如 D:\data\procMain.splx,運行后可以看到結果:

Picture5png

第 2 個例子:

 A
1=connect("mysql").query@x("select * from ventas")
2=A1.group(#2)
3=A2.conj(~1 | ~.select@1((#3 - A2.~1.#3)>30))

加載數據;按 2 個字段分組,但不匯總;取每組第 1 條,再篩選出距第 1 條 30 天以上的記錄,也取第 1 條;合并這 2 條記錄,最后合并各組的處理結果。

保存成 D:\data\proc2.splx,執行后看結果:

Picture6png


第 3 個例子:

=connect("mysql").query@x("select * from ventas").pivot@s(month;product,sum(amount))

加載數據后動態轉置,執行結果:

Picture7png


在 IDE 中調試無誤后,就可以把 esProc 集成到 Java 環境中了。
從目錄 "[安裝目錄]\esProc\lib" 下找到 esProc JDBC 相關的 jar 包:esproc-bin-xxxx.jar、icu4j_60.3.jar。

Picture8png


將這兩個 jar 包部署到 Java 開發環境的類路徑下。
再從目錄 "[安裝目錄]\esProc\config" 下找到 esProc 配置文件 raqsoftConfig.xml,同樣部署到 Java 開發環境的類路徑下。

Picture9png


配置文件中要改的配置項是 mainPath,這表示腳本等文件的默認路徑。注意數據源的信息也在配置文件中。
接下來,就可以編寫 Java 代碼,通過 esProc JDBC 調用 SPL 腳本了,例子 1:

Class.forName("com.esproc.jdbc.InternalDriver");
Connection con= DriverManager.getConnection("jdbc:esproc:local://");
PreparedStatement st = con.prepareCall("call procMain(?,?)");
st.setTime(1,Time.valueOf("10:00:00"));
st.setTime(2,Time.valueOf("11:00:00"));
ResultSet rs = st.executeQuery();

可以看到,調用 SPL 腳本的過程和調用存儲過程是一樣的。計算后結果如下:

Picture10png


腳本文件不是必須的,可以把 SPL 腳本轉為 SPL 代碼,像 SQL 那樣嵌入 Java。先在 IDE 中打開例子 2 的腳本文件,選中有代碼的單元格 A1-A3,再點擊菜單 "Edit->Copy->Code copy",這樣就把多行多列的網格代碼轉成了單行的 SPL 代碼,暫存在粘貼板里。

Picture11png


將轉換后的 SPL 代碼復制到 Java 代碼中

Connection con= DriverManager.getConnection("jdbc:esproc:local://");
PreparedStatement st = con.prepareStatement("==connect(\"mysql\").query@x(\"select * from ventas\")\n=A1.group(#2) \n=A2.conj(~1 | ~.select@1((#3 - A2.~1.#3)>30))");
ResultSet rs = st.executeQuery();
可以看到,Java調用SPL代碼的過程和調用SQL代碼一樣。運行后可以看到結果:

可以看到,Java調用SPL代碼的過程和調用SQL代碼一樣。運行后可以看到結果:

Picture12png


有些 SPL 代碼比較簡單,沒必要用 esProc IDE 編寫調試,那就可以直接寫在 Java 里。比如例子 3,直接在 Java 中嵌入 SPL 代碼:

Connection con= DriverManager.getConnection("jdbc:esproc:local://");
PreparedStatement st = con.prepareStatement("=connect(\"mysql\").query@x(\"select * from ventas\").pivot@s(month;product,sum(amount))");
ResultSet rs = st.executeQuery();

執行結果像下面這樣:

Picture13png


乾學院上還有很多補充 SQL 缺失能力的例子,開發遇到問題時可以去找找解決辦法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76075.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76075.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

迷你世界腳本腳本常見問題

腳本常見問題 彼得兔 更新時間: 2024-05-22 17:54:44 在查閱開發者學院中的腳本API時&#xff0c;若有任何問題或建議&#xff0c;歡迎通過問卷進行反饋&#xff01;【點我填寫問卷】 1.Block中的data在什么地方使用 data使用有具體需求,此處不建議開發者使用。開發者盡可能使…

四、Appium Inspector

一、介紹 Appium Inspector 是一個用于移動應用自動化測試的圖形化工具&#xff0c;主要用于檢查和交互應用的 UI 元素&#xff0c;幫助生成和調試自動化測試腳本。類似于瀏覽器的F12(開發者工具),Appium Inspector 的主要作用包括&#xff1a;? 1.?檢查 UI 元素? …

android11通過白名單卸載安裝應用

目錄 1.源碼路徑: 2.準備文件package.conf: 3.安裝方法installPackagesLI 4.卸載方法deletePackageX 1.源碼路徑: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java public static final String WHITELIST_PATH="/data/misc/pa…

qt mapFrom返回的QPoint和event->pos()區別和globalPos區別

mousePressEvent 和 eventFilter 里 event.pos 不一樣&#xff0c;一定要注意 eventFilter里event.pos 直接返回相對于label左上角的坐標&#xff0c;就不要再mapFrom mousePressEvent 里event.pos 返回是相對于窗口左上角的坐標&#xff0c;需要用mapFrom返回label左上角的…

Hadoop四 Hive語法

一 數據庫操作 Hive數據庫操作&#xff0c;與MySql有很多都是一致的 創建數據庫 create database if not exists myhive; use myhive;查看數據庫詳細信息 desc database myhive;數據庫本質上就是在HDFS之上的文件夾&#xff0c;是一個以.db結尾的目錄&#xff0c;默認存…

前端VUE框架理論與應用(10)

1、記住全局注冊的行為必須在根 Vue 實例 (通過 new Vue) 創建之前發生。 2、要注意,以 / 開頭的嵌套路徑會被當作根路徑。 這讓你充分的使用嵌套組件而無須設置嵌套的路徑。 3、注意:在 Vue 實例內部,你可以通過 $router 訪問路由實例。因此你可以調用 this.$router.push…

leetcode-單調棧26

關于單調棧的順序總結&#xff1a; 尋找右邊第一個比我大的&#xff1a;從左到右遍歷&#xff0c;棧單調遞減 尋找左邊第一個比我小的&#xff1a;從左到右遍歷&#xff0c;棧單調遞增 尋找右邊第一個比我小的&#xff1a;從右到左遍歷&#xff0c;棧單調遞增 尋找左邊第一個比…

Linux:安裝 CentOS 7(完整教程)

文章目錄 一、簡介二、安裝 CentOS 72.1 虛擬機配置2.2 安裝CentOS 7 三、連接遠程服務器&#xff08;擴展&#xff09;3.1 獲取虛擬機 IP 地址3.2 連接遠程服務器 四、結語 一、簡介 CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一個基于 Linux 的…

Nautilus 正式發布:為 Sui 帶來可驗證的鏈下隱私計算

作為 Sui 安全工具包中的強大新成員&#xff0c;Nautilus 現已上線 Sui 測試網。它專為 Web3 開發者打造&#xff0c;支持保密且可驗證的鏈下計算。Nautilus 應用運行于開發者自主管理的可信執行環境&#xff08;Trusted Execution Environment&#xff0c;TEE&#xff09;中&a…

Git完全指南:從入門到精通版本控制 ------- Git 工作流程 (3)

Git工作流程完全指南&#xff1a;從入門到高效協作 引言 Git作為分布式版本控制系統的行業標準&#xff0c;其高效的分支管理能力是團隊協作的基石。本文將深入解析標準Git工作流程&#xff0c;助你掌握從代碼提交到團隊協作的全鏈路實踐。 一、Git核心概念速覽 三大工作區域 …

Distortion, Animation Raymarching

這節課的主要目的是對uv進行操作&#xff0c;實現一些動畫的效果&#xff0c;實際就是采樣的動畫 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…

《vue3學習手記3》

標簽的ref屬性 vue3和vue2中的ref屬性&#xff1a; 用在普通DOM標簽上&#xff0c;獲取的是DOM節點 ref用在組件標簽上&#xff0c;獲取的是組件實例對象 區別在于&#xff1a; 1.vue3中person子組件中的數據父組件App不能直接使用&#xff0c;需要引入并使用defineExpose才可…

List基礎與難度題

1. 向 ArrayList 中添加元素并打印 功能描述&#xff1a; 程序創建一個空的 ArrayList 集合&#xff0c;用于存儲字符串類型的元素。向該 ArrayList 中依次添加指定的字符串元素。使用增強型 for 循環遍歷 ArrayList 中的所有元素&#xff0c;并將每個元素打印輸出到控制臺。 …

樓宇自控系統如何為現代建筑打造安全、舒適、節能方案

在科技飛速發展的當下&#xff0c;現代建筑對功能和品質的要求日益提升。樓宇自控系統作為建筑智能化的核心技術&#xff0c;宛如一位智慧的“管家”&#xff0c;憑借先進的技術手段&#xff0c;為現代建筑精心打造安全、舒適、節能的全方位解決方案&#xff0c;讓建筑真正成為…

綠算輕舟系列FPGA加速卡:驅動數字化轉型的核心動力【2】

工業與醫療&#xff1a;精準化的幕后推手 在工業4.0與智慧醫療領域&#xff0c;綠算輕舟FPGA加速卡通過實時信號處理與高精度控制&#xff0c;推動關鍵場景的技術升級。 工業自動化&#xff1a;在機器視覺質檢中&#xff0c;實現亞像素級缺陷檢測&#xff0c;產線檢測速度大幅…

uniapp-商城-22-頂部模塊

這里其實很復雜.我們在前面已經說了這個組件 shop-headbar ,這里來繼續說。 該組件實現一個高度的顯示以及圖片展示,包含logo 名稱 后臺管理以及避讓 導航欄 和 手機的狀態欄。 1 整體 代碼如下: <template><view class="headr" :style="{ hei…

利用Global.asax在ASP.NET Web應用中實現功能

Global.asax文件&#xff08;也稱為ASP.NET應用程序文件&#xff09;是ASP.NET Web應用程序中的一個重要文件&#xff0c;它允許您處理應用程序級別和會話級別的事件。下面介紹如何利用Global.asax來實現各種功能。 Global.asax基本結構 <% Application Language"C#&…

ReportLab 導出 PDF(頁面布局)

ReportLab 導出 PDF&#xff08;文檔創建&#xff09; ReportLab 導出 PDF&#xff08;頁面布局&#xff09; ReportLab 導出 PDF&#xff08;圖文表格) PLATYPUS - 頁面布局和排版 1. 設計目標2. 開始3. Flowables3.1. Flowable.draw()3.2. Flowable.drawOn(canvas,x,y)3.3. F…

Ubuntu下安裝Intel MKL完整指南

&#x1f9e0; Intel MKL 安裝指南&#xff08;Ubuntu 完整版&#xff09; 適用平臺&#xff1a;Ubuntu 18.04 / 20.04 / 22.04 更新時間&#xff1a;2025 年最新版&#xff08;適配 Intel oneAPI 2024&#xff09; ? 一、安裝方式選擇 安裝方式適合用戶群體特點推薦程度&…

HackMyVM Gigachad.

Gigachad 信息搜集 ┌──(root?kali)-[/home/kali] └─# nmap 192.168.214.85 Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-16 07:42 EDT Nmap scan report for 192.168.214.85 Host is up (0.00011s latency). Not shown: 997 closed tcp ports (reset) PORT S…