You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于T-SQL两列文本内容实现页面分类

T-SQL实现基于URL路径与页面名称的多类别分类

针对你的大规模分类需求(76个类别,每个对应多组URL/页面名称规则),分类映射表+关联查询是最优方案,比嵌套CASE或重复CONTAINS更易维护,也能同时满足两列匹配的需求。

步骤1:创建分类映射表

先建一个存储分类规则的映射表,用来统一管理所有类别与匹配规则,后续修改分类只需更新这个表,无需改动主查询代码。

CREATE TABLE WebPageCategoryMapping (
    MappingID INT IDENTITY(1,1) PRIMARY KEY,
    CategoryName NVARCHAR(100) NOT NULL, -- 类别名称
    MatchField NVARCHAR(20) NOT NULL CHECK (MatchField IN ('URL_PATH', 'PAGE_NAME', 'BOTH')), -- 匹配的字段
    MatchPattern NVARCHAR(255) NOT NULL -- 需要包含的字符串(和Power Query的Text.Contains逻辑一致)
);

插入示例分类规则

比如某个类别"产品详情页",对应URL包含"/product/"或页面名称包含"产品详情":

INSERT INTO WebPageCategoryMapping (CategoryName, MatchField, MatchPattern)
VALUES
('产品详情页', 'URL_PATH', '/product/'),
('产品详情页', 'PAGE_NAME', '产品详情'),
('首页', 'URL_PATH', '/home'),
('首页', 'PAGE_NAME', '网站首页'),
-- 依次插入剩下74个类别的所有匹配规则
('未分类', 'BOTH', '') -- 可选:默认分类,用于无匹配的情况

步骤2:关联原数据表实现分类

通过CROSS APPLY或LEFT JOIN结合CHARINDEX(替代CONTAINS,更灵活)来匹配规则,同时处理一个页面匹配多个类别的优先级问题(比如取第一个匹配的类别)。

假设你的原数据表名为AdobeAnalyticsData,包含URL_PATH和PAGE_NAME字段:

SELECT
    a.*,
    -- 优先取匹配到的第一个类别,无匹配则用默认的"未分类"
    COALESCE(c.CategoryName, '未分类') AS PageCategory
FROM AdobeAnalyticsData a
LEFT JOIN (
    -- 对每个页面取优先级最高的匹配类别(可通过MappingID或自定义排序字段控制优先级)
    SELECT
        a2.URL_PATH,
        a2.PAGE_NAME,
        m.CategoryName,
        -- 给匹配规则设优先级:比如URL匹配优先于页面名称匹配
        ROW_NUMBER() OVER (PARTITION BY a2.URL_PATH, a2.PAGE_NAME 
                          ORDER BY CASE m.MatchField WHEN 'URL_PATH' THEN 1 WHEN 'PAGE_NAME' THEN 2 ELSE 3 END) AS RN
    FROM AdobeAnalyticsData a2
    INNER JOIN WebPageCategoryMapping m
        ON (m.MatchField = 'URL_PATH' AND CHARINDEX(m.MatchPattern, a2.URL_PATH) > 0)
        OR (m.MatchField = 'PAGE_NAME' AND CHARINDEX(m.MatchPattern, a2.PAGE_NAME) > 0)
        OR (m.MatchField = 'BOTH' AND (CHARINDEX(m.MatchPattern, a2.URL_PATH) > 0 OR CHARINDEX(m.MatchPattern, a2.PAGE_NAME) > 0))
    -- 排除默认的未分类规则,最后再处理
    WHERE m.CategoryName != '未分类'
) c ON a.URL_PATH = c.URL_PATH AND a.PAGE_NAME = c.PAGE_NAME AND c.RN = 1;

方案优势

  • 易维护:76个类别的所有规则都存在映射表中,新增/修改/删除分类只需操作表,无需修改复杂的查询语句
  • 灵活匹配:支持单独匹配URL、单独匹配页面名称,或同时匹配两者
  • 性能可控:如果数据量极大,可给URL_PATH和PAGE_NAME加非聚集索引,或对映射表的MatchPattern做简单优化(比如避免过长的匹配字符串)

替代简化方案(无需映射表,适合临时场景)

如果不想建表,也可以用CASE+CHARINDEX的组合,但仅推荐临时使用——76个类别会让代码非常冗长,维护困难:

SELECT
    *,
    CASE
        WHEN CHARINDEX('/product/', URL_PATH) > 0 OR CHARINDEX('产品详情', PAGE_NAME) > 0 THEN '产品详情页'
        WHEN CHARINDEX('/home', URL_PATH) > 0 OR CHARINDEX('网站首页', PAGE_NAME) > 0 THEN '首页'
        -- 依次添加剩下74个类别的判断条件
        ELSE '未分类'
    END AS PageCategory
FROM AdobeAnalyticsData;

内容的提问来源于stack exchange,提问作者SirArtisanAzalea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:05:18