【SQL】如何在 SQL 中統計結構化字符串的特征頻率

?在數據分析場景中,我們經常會遇到需要解析結構化字符串并統計特征出現次數的需求。本文將以常用數據庫為例,探討如何高效處理類似 [特征A][特征B][特征C] 格式的字符串數據,并實現特征頻率統計。以下是完整的實現思路和解決方案。


一、問題場景分析

假設某字段存儲多個特征值,采用以下格式:

  • 每個特征用方括號包裹
  • 多個特征連續排列
  • 示例:[屬性A][屬性B][屬性X]

需要實現:

  1. 解析所有特征值
  2. 統計每個特征的全局出現次數

二、關鍵技術挑戰

1. 字符串分割限制

有些數據庫沒有內置的 SPLIT_STRING 函數,需要利用基礎字符串處理函數實現分割。

2. 動態長度處理

特征值的長度不固定,需動態定位分割點。

3. 遞歸處理需求

當單條記錄包含多個特征時,需要遞歸或迭代處理。


三、核心解決方案

方案一:遞歸 CTE 解析法(推薦)

WITH RECURSIVE feature_extractor(feature, remaining) AS (SELECT substr(data_field, 2, instr(substr(data_field, 2), ']') - 1),substr(data_field, instr(substr(data_field, 2), ']') + 2)FROM example_tableWHERE data_field LIKE '%[%]%'UNION ALLSELECT substr(remaining, 2, instr(substr(remaining, 2), ']') - 1),substr(remaining, instr(substr(remaining, 2), ']') + 2)FROM feature_extractorWHERE remaining LIKE '%[%]%'
)SELECT feature, COUNT(*) AS frequency
FROM feature_extractor
WHERE feature != ''
GROUP BY feature
ORDER BY frequency DESC;

實現原理

  1. 使用 WITH RECURSIVE 創建遞歸公共表達式
  2. 初始查詢定位第一個特征:
    • substr(data_field, 2) 跳過首字符 [
    • instr() 定位第一個 ] 的位置
  3. 遞歸部分持續處理剩余字符串
  4. 終止條件:剩余字符串不再包含特征格式

優勢

  • 自動適應任意數量的特征
  • 精確處理動態長度特征
  • 完全遵循 SQL 標準

方案二:數字輔助表法

-- 創建數字輔助表(0-9)
WITH numbers AS (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
)SELECT substr(substr(data_field, n*5+1),  -- 5為特征平均長度估算值2, instr(substr(data_field, n*5+1), ']')-2) AS feature,COUNT(*) AS frequency
FROM example_table, numbers
WHERE n <= (length(data_field) - length(replace(data_field, '[', '')))AND substr(data_field, n*5+1, 1) = '['
GROUP BY feature
HAVING feature != ''
ORDER BY frequency DESC;

適用場景

  • 特征數量已知且較少
  • 特征長度相對固定
  • 需要避免遞歸查詢的情況

注意事項

  • 需要合理估算特征平均長度(示例中的5)
  • 數字表范圍需覆蓋最大特征數量

四、方案對比

維度遞歸CTE法數字輔助表法
處理能力任意數量特征受數字表范圍限制
性能表現大數據量時較慢預計算更快
實現復雜度需要理解遞歸邏輯簡單易理解
格式適應性嚴格依賴格式需要長度估算
內存消耗較高較低

五、擴展:獲取不重復的全部特征

要從結構化字符串中提取所有不重復的特性,我們可以基于之前的解決方案稍作調整。以下是幾種在SQLite中實現的方案:

方案一:使用遞歸CTE提取唯一特性(推薦)

WITH RECURSIVE feature_extractor(feature, remaining) AS (SELECT substr(data_field, 2, instr(substr(data_field, 2), ']') - 1),substr(data_field, instr(substr(data_field, 2), ']') + 2)FROM example_tableWHERE data_field LIKE '%[%]%'UNION ALLSELECT substr(remaining, 2, instr(substr(remaining, 2), ']') - 1),substr(remaining, instr(substr(remaining, 2), ']') + 2)FROM feature_extractorWHERE remaining LIKE '%[%]%'
)SELECT DISTINCT feature
FROM feature_extractor
WHERE feature != ''
ORDER BY feature;

方案二:使用GROUP BY替代DISTINCT

-- 使用與方案一相同的CTE
WITH RECURSIVE feature_extractor AS (...)
SELECT feature
FROM feature_extractor
WHERE feature != ''
GROUP BY feature  -- GROUP BY也能實現去重
ORDER BY feature;

方案三:簡化的數字輔助表法

WITH numbers AS (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
)SELECT DISTINCTsubstr(substr(data_field, n*5+1),2, instr(substr(data_field, n*5+1), ']')-2) AS feature
FROM example_table, numbers
WHERE n <= (length(data_field) - length(replace(data_field, '[', '')))AND substr(data_field, n*5+1, 1) = '['AND feature != ''
ORDER BY feature;

六、注意事項

  1. 格式嚴格性要求

    • 禁止嵌套括號:[[特征A]]
    • 禁止未閉合括號:[特征A][特征B
    • 禁止空特征:[][]
  2. 特殊字符處理

    • 如果特征包含 ] 字符需轉義
    • 建議使用統一的分隔符(如 Unicode 控制字符)
  3. 性能監控

    • 遞歸深度限制:PRAGMA max_recursive_depth=1000;
    • 查詢執行計劃分析:EXPLAIN QUERY PLAN

通過本文介紹的兩種方法,開發者可以靈活應對不同場景下的結構化字符串處理需求。實際應用中建議先進行小數據量測試,再結合具體業務場景選擇合適的實現方案。

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

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

相關文章

Docker Compose 的安裝方法

以下是 Docker Compose 的安裝方法整理&#xff0c;綜合了多篇指南的推薦步驟和注意事項&#xff1a; 一、安裝前準備 確保已安裝 Docker Docker Compose 依賴 Docker 引擎運行&#xff0c;需先安裝 Docker。若未安裝&#xff0c;可通過以下命令一鍵安裝&#xff08;國內服…

配置Nginx解決http host頭攻擊漏洞【詳細步驟】

前言 大概內容&#xff1a; 安全系統滲透測試出host頭攻擊漏洞&#xff0c;下面是解決步驟&#xff0c;本人已測過無問題。 server_name aaabbb.com; if ($http_Host !~* ^127.0.0.1|aaabbb.com|localhost$){return 403;}

自研時序大模型講解(4月29日)直播回顧

4 月 29 日&#xff0c;清華團隊揭秘&#xff1a;時序大模型如何讓數據“活”起來線上直播圓滿結束。清華大學軟件學院博士生&#xff0c;IoTDB 原生機器學習引擎 AINode 研發同學劉雍在線上面向數千人次的時序數據分析人員與 AI 大模型行業關注者&#xff0c;就時序大模型的發…

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作獲取第二維度,第三維度

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作獲取第1 維度,第二維度 attention_weights = torch.ones_like(prompt_embedding[:, :, 0]) 這行代碼的作用是創建一個與 prompt_embedding[:, :, 0] 形狀相同且所有元素都為 1 的張量,它用于初始化…

鴻蒙Next API17新特性學習之如何使用新增鼠標軸事件

今天咱們接著學習鴻蒙開發文檔API17版本的新特性——對鼠標軸事件的支持。這對于需要精細交互的應用來說是一個非常有用的特性&#xff0c;例如地圖滾動、文檔瀏覽等場景。本文將詳細介紹在鴻蒙 Next 中如何使用新增的鼠標軸事件。 開發步驟 環境準備 在開始開發之前&#x…

【行為型之命令模式】游戲開發實戰——Unity可撤銷系統與高級輸入管理的架構秘鑰

文章目錄 ?? 命令模式&#xff08;Command Pattern&#xff09;深度解析一、模式本質與核心價值二、經典UML結構三、Unity實戰代碼&#xff08;可撤銷的建造系統&#xff09;1. 定義命令接口與接收者2. 實現具體命令3. 命令管理器&#xff08;Invoker&#xff09;4. 客戶端使…

計算機網絡|| 路由器和交換機的配置

一、實驗目的 1. 了解路由器和交換機的工作模式和使用方法&#xff1b; 2. 熟悉 Cisco 網絡設備的基本配置命令&#xff1b; 3. 掌握 Cisco 路由器的基本配置方式及配置命令&#xff1b; 4. 掌握路由器和交換機的基本配置與管理方法。 二、實驗環境 1. 運行 Windows 操作…

面試--HTML

1.src和href的區別 總結來說&#xff1a; <font style"color:rgb(238, 39, 70);background-color:rgb(249, 241, 219);">src</font>用于替換當前元素&#xff0c;指向的資源會嵌入到文檔中&#xff0c;例如腳本、圖像、框架等。<font style"co…

CVPR2025 | Prompt-CAM: 讓視覺 Transformer 可解釋以進行細粒度分析

Prompt-CAM: Making Vision Transformers Interpretable for Fine-Grained Analysis 摘要-Abstract引言-Introduction方法-Approach預備知識-PreliminariesPrompt-CAM: Prompt Class Attention Map特征識別與定位-Trait Identification and Localization變體與擴展-Variants an…

動態規劃問題 -- 多狀態模型(粉刷房子)

目錄 動態規劃分析問題五步曲題目概述代碼編寫 動態規劃分析問題五步曲 不清楚動態規劃分析問題是哪關鍵的五步的少年們可以移步到 鏈接: 動態規劃算法基礎 這篇文章非常詳細的介紹了動態規劃算法是如何分析和解決問題的 題目概述 鏈接: 粉刷房子 狀態表示&#xff08;題目要求…

Spring Boot 注解詳細解析:解鎖高效開發的密鑰

一、引言 Spring Boot 以其快速開發、自動配置等特性&#xff0c;成為構建 Java 應用程序的熱門框架。而注解在 Spring Boot 中扮演著至關重要的角色&#xff0c;它們如同魔法指令&#xff0c;簡化了配置流程&#xff0c;增強了代碼的可讀性與可維護性。本文將深入剖析 Spring…

【Python】抽象基類ABC

抽象基類(Abstract Base Classes)的核心作用 抽象基類(ABC)是Python中一種特殊的類&#xff0c;它通過abc模塊實現&#xff0c;主要服務于面向對象編程中的接口規范和設計約束。以下是它的核心作用&#xff1a; 1. 強制接口實現&#xff08;核心作用&#xff09; 確保子類必…

[python] Python單例模式:__new__與線程安全解析

一 實例的創建過程 我們之前了解過在構造一個類的實例化對象時,會默認調用__init__方法&#xff0c;也就是類的初始化也叫構造函數&#xff0c;但其實在調用__init__方法前會首先調用__new__方法&#xff08;只有在py3新式類才有&#xff09;。即下面 __new__(): 創建實例 作…

筆記本電腦打開網頁很慢,一查ip地址網段不對怎么處理

我有一個筆記本&#xff0c;在家里連WIFI后獲取到的ip地址網段不對&#xff0c;那么常規做法是手動去配置個靜態IP和DNS&#xff0c;要知道筆記本IP地址默認采用的是DHCP&#xff0c;也就是動態獲取ip地址。如果手動設置靜態IP&#xff0c;也就是固定IP的話&#xff0c;你換個場…

怎樣將MM模塊常用報表設置為ALV默認格式(MB52、MB5B、ME2M、ME1M等)

【SAP系統研究】 對SAP系統中的報表,最方便的格式就是ALV了,可排序、可導出,非常友好。 但有些常見報表卻不是默認ALV界面的,譬如MB52: 是不是有點別扭?但其實是可以后臺配置進行調整的。 現將一些常用報表修改為默認ALV的方法進行總結,便于大家使用。 一、MB52、MB5…

Redis——達人探店

達人探店 發布探店筆記 探店筆記類似點評網站的評價&#xff0c;往往是圖文結合&#xff0c;對應的表有兩個&#xff1a; 發布博文對應兩個接口 案例&#xff1a;實現查看發布探店筆記的接口 需求&#xff1a;點擊首頁的探店筆記&#xff0c;會進入詳情頁面&#xff0c;實現…

Git初始化相關配置

Git配置 在Git安裝完成后&#xff0c;windows操作系統上會多出一個Git Bash的軟件&#xff0c;如果是linux或者是macOS&#xff0c;那么直接打開終端&#xff0c;在終端中敲擊命令即可 # 檢查git版本 git -v # 或 git --version在使用git時&#xff0c;需要配置一下用戶名和郵…

MySQL JSON_ARRAYAGG 實現匯總+明細數據展示

一、業務場景 在投注記錄查詢功能中&#xff0c;我們需要展示每個彩票期號(userId lotteryIssue分組)的匯總數據&#xff08;總金額、總注數&#xff09;&#xff0c;同時也要顯示該期號下的所有明細投注記錄。 解決方案&#xff1a;JSON_ARRAYAGG MySQL 5.7 提供的 JSON_A…

【Lua】Redis 自增并設置有效期

【Lua】Redis 自增并設置有效期 方案一 每次執行都會更新有效期 EVAL "local current redis.call(INCRBY, KEYS[1], ARGV[1]);if tonumber(ARGV[2]) > 0 then redis.call(EXPIRE, KEYS[1], ARGV[2]) end;return current;" 1 mycounter 1 10 參數: 1 代表KEY…

CCF第七屆AIOps國際挑戰賽季軍分享(RAG)

分享CCF 第七屆AIOps國際挑戰賽的季軍方案&#xff0c;從我們的比賽經歷來看&#xff0c;并不會&#xff0c;相反&#xff0c;私域領域問答的優秀效果說明RAG真的很重要 歷經4個月的時間&#xff0c;從初賽賽道第1&#xff0c;復賽賽道第2&#xff0c;到最后決賽獲得季軍&…