TDengine GREATEST 和 LEAST 函數用戶手冊

在這里插入圖片描述

TDengine GREATEST 和 LEAST 函數用戶手冊

1. 需求背景

1.1 問題描述

在實際生產過程中,客戶經常需要計算三相電流、電壓的最大值和最小值。傳統的實現方式需要使用復雜的 CASE WHEN 語句,例如:

-- 傳統方式:計算三相電流最大值
SELECT ts,CASE WHEN current_a >= current_b AND current_a >= current_c THEN current_aWHEN current_b >= current_a AND current_b >= current_c THEN current_bELSE current_cEND AS max_current
FROM power_meter;-- 傳統方式:計算三相電壓最小值
SELECT ts,CASE WHEN voltage_a <= voltage_b AND voltage_a <= voltage_c THEN voltage_aWHEN voltage_b <= voltage_a AND voltage_b <= voltage_c THEN voltage_bELSE voltage_cEND AS min_voltage
FROM power_meter;

1.2 存在的問題

  1. 語句冗長:每次比較多個字段需要編寫大量的 CASE WHEN 邏輯
  2. 效率低下:復雜的條件判斷影響查詢性能
  3. 可讀性差:代碼難以理解和維護
  4. 易出錯:復雜的邏輯容易產生錯誤

1.3 解決方案

新增跨字段求最大、最小值的函數 GREATESTLEAST,用于替代復雜的 CASE WHEN 語句,提供更簡潔、高效的解決方案。

2. 函數語法

2.1 GREATEST 函數

GREATEST(expr1, expr2[, expr3, ...])

功能說明:獲得輸入的所有參數中的最大值。該函數最小參數個數為 2 個。

2.2 LEAST 函數

LEAST(expr1, expr2[, expr3, ...])

功能說明:獲得輸入的所有參數中的最小值,其余部分同 GREATEST 函數。

3. 支持的數據類型

  • 數值類型:包括 bool 型、整型和浮點型
  • 字符串類型:支持 nchar 和 varchar 類型
  • 時間戳類型:TIMESTAMP 類型作為數值類型處理

注意:不支持上述之外的其他類型。

4. 返回結果類型

返回結果類型參考比較規則,比較類型即為最終返回類型。

5. 比較規則

5.1 基本規則

  1. NULL 處理:如果有任何一個參數為 NULL,則比較結果為 NULL
  2. 字符串比較:如果比較操作中的所有參數都是字符串類型,按照字符串類型比較
  3. 數值比較:如果所有參數都是數值類型,則將它們作為數值類型進行比較
  4. 時間戳比較:TIMESTAMP 類型也是數值類型,當和 TIMESTAMP 參與比較的類型都是整數類型時,按照 TIMESTAMP 進行比較

5.2 混合類型比較

如果參數中既有字符串類型,也有數值類型,根據 compareAsStrInGreatest 配置項,統一作為字符串或者數值進行比較。默認按照字符串比較。

5.3 類型提升規則

在所有情況下,不同類型比較,比較類型會選擇范圍更大的類型進行比較。例如作為整數類型比較時,如果存在 BIGINT 類型,必定會選擇 BIGINT 作為比較類型。

6. 相關配置項

客戶端配置compareAsStrInGreatest

  • 值為 1:同時存在字符串類型和數值類型統一轉為字符串比較
  • 值為 0:統一轉為數值類型比較
  • 默認值:1

7. 使用示例

7.1 基本數值比較

-- 計算三相電流最大值
SELECT ts,GREATEST(current_a, current_b, current_c) AS max_current
FROM power_meter;-- 計算三相電壓最小值
SELECT ts,LEAST(voltage_a, voltage_b, voltage_c) AS min_voltage
FROM power_meter;

7.2 多字段比較

-- 計算多個傳感器溫度的最大值
SELECT ts,GREATEST(temp_sensor1, temp_sensor2, temp_sensor3, temp_sensor4) AS max_temperature
FROM sensor_data;-- 計算多個傳感器濕度的最小值
SELECT ts,LEAST(humidity_sensor1, humidity_sensor2, humidity_sensor3) AS min_humidity
FROM sensor_data;

7.3 字符串比較

-- 字符串最大值比較
SELECT GREATEST('apple', 'banana', 'cherry') AS max_fruit;
-- 結果:'cherry'-- 字符串最小值比較
SELECT LEAST('apple', 'banana', 'cherry') AS min_fruit;
-- 結果:'apple'

7.4 混合類型比較

-- 混合類型比較(默認按字符串比較)
SELECT GREATEST(10, '20', 5) AS result;
-- 結果:'20'(字符串比較)-- 如果配置 compareAsStrInGreatest = 0
SELECT GREATEST(10, '20', 5) AS result;
-- 結果:20(數值比較)

7.5 NULL 值處理

-- 包含 NULL 的比較
SELECT GREATEST(10, NULL, 20) AS result;
-- 結果:NULLSELECT LEAST(10, NULL, 20) AS result;
-- 結果:NULL

7.6 實際應用場景

-- 電力監控:計算三相功率最大值
SELECT ts,device_id,GREATEST(power_a, power_b, power_c) AS max_phase_power,LEAST(power_a, power_b, power_c) AS min_phase_power,(power_a + power_b + power_c) AS total_power
FROM power_consumption
WHERE ts >= '2023-01-01 00:00:00'
ORDER BY ts;-- 環境監控:計算多點溫度極值
SELECT ts,location,GREATEST(temp_indoor, temp_outdoor, temp_equipment) AS max_temp,LEAST(temp_indoor, temp_outdoor, temp_equipment) AS min_temp,ABS(GREATEST(temp_indoor, temp_outdoor, temp_equipment) - LEAST(temp_indoor, temp_outdoor, temp_equipment)) AS temp_range
FROM environmental_data
WHERE ts >= NOW() - INTERVAL 1 DAY;

8. 性能優勢

使用 GREATESTLEAST 函數相比傳統的 CASE WHEN 語句具有以下優勢:

  1. 代碼簡潔:大幅減少代碼量,提高可讀性
  2. 性能提升:內置函數執行效率更高
  3. 維護性好:邏輯清晰,易于理解和維護
  4. 錯誤率低:減少因復雜邏輯導致的錯誤

9. 注意事項

  1. 最小參數個數:函數至少需要 2 個參數
  2. 數據類型限制:僅支持數值類型、字符串類型(nchar/varchar)
  3. NULL 處理:任何參數為 NULL 時,結果為 NULL
  4. 混合類型:注意 compareAsStrInGreatest 配置項的影響
  5. 類型提升:系統會自動選擇范圍更大的類型進行比較

10. 支持版本

TDengine 3.3.6.0 及以上版本。

11. 常見問題

Q1: 如何處理不同數據類型的比較?

A1: 系統會根據 compareAsStrInGreatest 配置項決定比較方式。默認情況下,混合類型會統一按字符串比較。

Q2: 函數是否支持時間戳類型?

A2: 支持。TIMESTAMP 類型作為數值類型處理,當與整數類型比較時按照 TIMESTAMP 進行比較。

Q3: 如何在聚合查詢中使用這些函數?

A3: 可以在 SELECT、WHERE、HAVING 等子句中正常使用,與其他函數組合使用。

Q4: 函數的參數個數有限制嗎?

A4: 最少需要 2 個參數,最多參數個數由系統限制決定。

通過使用 GREATESTLEAST 函數,您可以更高效地處理多字段比較需求,特別是在工業物聯網、電力監控等需要頻繁進行多維度數據比較的場景中。

關于 TDengine

TDengine 是一款專為物聯網、工業互聯網等場景設計并優化的大數據平臺,其核心模塊是高性能、集群開源、云原生、極簡的時序數據庫。它能安全高效地將大量設備每天產生的高達 TB 甚至 PB 級的數據進行匯聚、存儲、分析和分發,并提供 AI 智能體對數據進行預測與異常檢測,提供實時的商業洞察。

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

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

相關文章

Redis 與數據庫不一致問題及解決方案

一、不一致的原因分析 1. 緩存更新策略不當 先更新數據庫后刪除緩存:刪除緩存失敗會導致不一致 先刪除緩存后更新數據庫:并發請求可能導致不一致 緩存穿透:大量請求直接打到數據庫,繞過緩存 2. 并發操作問題 讀寫并發:讀請求獲取舊緩存時,寫請求更新了數據庫但未更新緩存…

iOS 加固工具使用經驗與 App 安全交付流程的實戰分享

在實際開發中&#xff0c;iOS App不僅要安全&#xff0c;還要能被穩定、快速、無誤地交付。這在外包、B端項目、渠道分發、企業自用系統等場景中尤為常見。 然而&#xff0c;許多開發者在引入加固工具后會遇到以下困擾&#xff1a; 混淆后App運行異常、不穩定&#xff1b;資源路…

Windows 下 Visual Studio 開發 C++ 項目的部署流程

在Windows環境中使用Visual Studio&#xff08;以下簡稱VS&#xff09;開發C項目時&#xff0c;“部署”是確保程序能在目標設備上正常運行的關鍵環節。部署的核心目標是&#xff1a;將編譯生成的可執行文件&#xff08;.exe&#xff09;、依賴的動態鏈接庫&#xff08;.dll&am…

yolo8+聲紋識別(實時字幕)

現在已經完成了人臉識別跟蹤 ?&#xff0c;接下來要&#xff1a; ? 加入「聲紋識別&#xff08;說話人識別&#xff09;」功能&#xff0c;識別誰在講話&#xff0c;并在視頻中“這個人”的名字旁邊加上「正在講話」。 這屬于多模態識別&#xff08;視覺 音頻&#xff09;&a…

DH(Denavit–Hartenberg)矩陣

DH 矩陣&#xff08;Denavit-Hartenberg 矩陣&#xff09;是 1955 年由 Denavit 和 Hartenberg 提出的一種機器人運動學建模方法&#xff0c;用于描述機器人連桿和關節之間的關系。該方法通過在機器人每個連桿上建立坐標系&#xff0c;并用 44 的齊次變換矩陣&#xff08;DH 矩…

Vim的magic模式

在 Vim 中&#xff0c;magic 模式用于控制正則表達式中特殊字符的解析方式。它決定了哪些字符需要轉義才能發揮特殊作用&#xff0c;從而影響搜索和替換命令的寫法。以下是詳細介紹&#xff1a; 一、三種 magic 模式 Vim 提供三種 magic 模式&#xff0c;通過在正則表達式前添加…

Git 使用技巧與原理(一)—— 基礎操作

1、起步 1.1 版本控制 版本控制是一種記錄一個或若干文件內容變化&#xff0c;以便將來查閱特定版本修訂情況的系統。 版本控制系統&#xff08;VCS&#xff0c;Version Control System&#xff09;通常可以分為三類&#xff1a; 本地版本控制系統&#xff1a;大多都是采用某…

軟件測試之自動化測試

目錄 1.什么是自動化測試 2.web?動化測試 2.1驅動 WebDriverManager 3. Selenium 3.1selenium驅動瀏覽器的?作原理 4.常用函數 4.1元素的定位 4.1.1cssSelector選擇器 4.2.2xpath 4.2操作測試對象 4.3窗? 4.4等待 4.5瀏覽器導航 4.6彈窗 4.7文件上傳 4.8設置…

sqlserver遷移日志文件和數據文件

sqlserver安裝后沒有指定日志存儲路徑或者還原庫指定的日志存儲位置不理想想要更改&#xff0c;都可以按照這種方式來更換&#xff1b;1.前提準備&#xff1a;數據庫的備份bak文件2.查看自己當前數據庫的日志文件和數據文件存儲路徑是否理想選中當前數據庫&#xff0c;右鍵屬性…

MFC UI表格制作從專家到入門

文章目錄CListCtrl常見問題增強版CGridCtrl&#xff08;第三方&#xff09;第三方庫ReoGridCListCtrl 默認情況下&#xff0c;CListCtrl不支持直接編輯單元格&#xff0c;需通過消息處理實現。 1.添加控件到資源視圖 在對話框資源編輯器中拖入List Control控件&#xff0c;設…

數字后端APR innovus sroute到底是如何選取寬度來鋪power rail的?

吾愛IC社區新一期IC訓練營將于7月初開班&#xff08;07.06號晚上第一次直播課&#xff09;&#xff01;社區所有IC后端訓練營課程均為直播課&#xff01;全網唯一一家敢開后端直播課的&#xff08;口碑不好招生一定存在困難&#xff0c;自然就無法開直播課&#xff09;&#xf…

LVS集群技術

LVS&#xff08;Linux Virtual Server&#xff09;是一種基于Linux內核的高性能、高可用性服務器集群技術&#xff0c;它通過負載均衡將客戶端請求分發到多臺后端真實服務器&#xff0c;實現 scalability 和 fault tolerance。LVS工作在傳輸層&#xff08;OSI Layer 4&#xff…

git項目,有idea文件夾,怎么去掉

要從Git項目中排除.idea文件夾&#xff08;IntelliJ IDEA的配置文件目錄&#xff09;&#xff0c;可以通過以下步驟操作&#xff1a; 1. 添加.gitignore規則 在項目根目錄創建或編輯.gitignore文件&#xff0c;添加以下內容&#xff1a; .idea/2. 從Git緩存中刪除已跟蹤的.idea…

springboot+swagger2文檔從swagger-bootstrap-ui更換為knife4j及文檔接口參數不顯示問題

背景 已有springboot項目,且使用的是swagger2+swagger-bootstrap-ui的版本 1.pom依賴如下 <!-- Swagger接口管理工具 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9…

mysql數據庫表只能查詢,對于插入、更新、刪除操作一直卡住,直到報錯Lost connection to MySQL server during query

診斷步驟1. 查看阻塞進程SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;SELECT * FROM sys.schema_table_lock_waits;2. 查看當前活動事務SELECT * FROM information_schema.INNODB_TRX;3. 查看進程列表SHOW PROCESSLIST;通過SELECT * FROM in…

Redis BigKey 深度解析:從原理到實戰解決方案

引言&#xff1a;什么是 BigKey&#xff1f;在 Redis 的使用場景中&#xff0c;BigKey&#xff08;大鍵&#xff09;是指那些數據量異常龐大的鍵值&#xff0c;通常表現為&#xff1a;String 類型&#xff1a;值大小超過 10KBHash/Set 等&#xff1a;元素數量超過 5000List/ZSe…

Qt 實現新手引導

Qt實現新手引導 對于一個新安裝的軟件或者一個新的功能&#xff0c;提供一個新手引導步驟&#xff0c;能夠讓用戶快速熟悉。這是最終效果&#xff0c;每一個按鈕都會有一個簡單引導&#xff0c;通過點擊上一步、下一步來切換不同的指導。當前引導的功能&#xff0c;會有一個高光…

Maven+Spring

一、Maven 相關- 本地倉庫設置&#xff1a;- 在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中可以設置 Maven 的本地倉庫路徑&#xff0c;本地倉庫用于存儲從遠程倉庫下載的依賴庫&#xff0c;方便項目重復使用。- 倉庫關系&#xff1a;- 項目&#xff1a;開發中的項目&…

Android Handler 消息機制

常用場景&#xff1a; 子線程發送Message 主線程處理Message 子線程發送消息 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {Message msg Message.obtain();msg.what what;return sendMessageDelayed(msg, delayMillis);}public final boole…

day9 串口通信

1串口通信串口通信是嵌入式系統和電子設備中最常用的 異步串行通信 方式&#xff0c;核心是通過 TX&#xff08;發送&#xff09; 和 R&#xff08;接收&#xff09; 兩根線實現全雙工數據傳輸。2通信協議分類2.1同步/異步通信同步和異步是串行通信中兩種根本不同的數據傳輸方式…