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

SQL Server 2016:单表中多行多列的值比较方法

在SQL Server 2016中实现单表多行多列值比较

我来帮你搞定这个多行多列的比较需求~首先先把你提供的测试表和数据整理完善(修正了字段名的拼写错误,补全了最后一行示例数据,保证能正常运行):

USE dev_db
GO
CREATE TABLE T1_VALS (
 [SITE_ID] [int] NULL,
 [LATITUDE] [numeric](10, 6) NULL,
 [UNIQUE_ID] [int] NULL,
 [COLLECT_RANK] [int] NULL,
 [CREATED_RANK] [int] NULL,
 [UNIQUE_ID_RANK] [int] NULL,
 [UPDATE_FLAG] [int] NULL
)
GO
INSERT INTO T1_VALS (SITE_ID,LATITUDE,UNIQUE_ID,COLLECT_RANK,CREATED_RANK,UNIQUE_ID_RANK)
VALUES
(207442,40.900470,59664,1,1,1),
(207442,40.900280,61320,1,1,2),
(204314,40.245220,48685,1,2,2),
(204314,40.245910,59977,1,1,1),
(202416,39.449530,9295,1,1,2),
(202416,39.449680,62123,1,2,1);
GO

下面针对几种常见的多行多列比较场景,给你具体的实现方法:

场景1:对比同SITE_ID下不同行的字段差异

如果想直观看到同一个站点(SITE_ID)下两行的纬度、唯一ID等字段的差异,用自连接就能轻松实现:

SELECT
    t1.SITE_ID,
    t1.LATITUDE AS 纬度_行1,
    t2.LATITUDE AS 纬度_行2,
    ABS(t1.LATITUDE - t2.LATITUDE) AS 纬度差值,
    t1.UNIQUE_ID AS 唯一ID_行1,
    t2.UNIQUE_ID AS 唯一ID_行2,
    t1.CREATED_RANK AS 创建排名_行1,
    t2.CREATED_RANK AS 创建排名_行2
FROM T1_VALS t1
JOIN T1_VALS t2 ON t1.SITE_ID = t2.SITE_ID AND t1.UNIQUE_ID <> t2.UNIQUE_ID;

这个查询会把每个站点下的不同行两两配对,直接展示各字段的数值差异,比如纬度的差值一目了然。

场景2:按优先级筛选每个站点的最优行

从你的数据来看,COLLECT_RANK、CREATED_RANK这些字段应该是优先级标识(数值越小优先级越高)。如果要为每个站点选出综合优先级最高的行,用窗口函数ROW_NUMBER()就很方便:

WITH 站点排名 AS (
    SELECT
        *,
        ROW_NUMBER() OVER (
            PARTITION BY SITE_ID
            ORDER BY COLLECT_RANK, CREATED_RANK, UNIQUE_ID_RANK
        ) AS 行序号
    FROM T1_VALS
)
SELECT *
FROM 站点排名
WHERE 行序号 = 1;

这里的排序逻辑是先看COLLECT_RANK,再看CREATED_RANK,最后看UNIQUE_ID_RANK,每个站点下排第一的就是最优行。如果存在多个行的优先级完全相同的情况,你可以把ROW_NUMBER()换成RANK(),这样会保留所有并列的最优行。

场景3:标记需要更新的行(设置UPDATE_FLAG)

如果要根据同站点内的行对比结果,自动设置UPDATE_FLAG(比如把非最优行标记为待更新),可以结合窗口函数和条件判断来实现:

WITH 站点基准值 AS (
    SELECT
        *,
        MIN(CREATED_RANK) OVER (PARTITION BY SITE_ID) AS 最小创建排名,
        MIN(UNIQUE_ID_RANK) OVER (PARTITION BY SITE_ID) AS 最小唯一ID排名
    FROM T1_VALS
)
UPDATE 站点基准值
SET UPDATE_FLAG = CASE
    WHEN CREATED_RANK = 最小创建排名 AND UNIQUE_ID_RANK = 最小唯一ID排名 THEN 0  -- 最优行,无需更新
    ELSE 1  -- 非最优行,标记为待更新
END;

这个语句会先为每个站点找出最小的CREATED_RANK和UNIQUE_ID_RANK,然后自动把不满足这两个最优条件的行的UPDATE_FLAG设为1,非常适合批量处理更新标记的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:53:44