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

连接含重复值与唯一值列时获取唯一记录的SQL查询方案

我明白你现在的困扰——内连接后出现了重复记录,导致Cube没法处理这个查询。问题根源应该是Fact_Monthly_Policy_Snap表(毕竟Dim_Geography的Geography_Identifier是唯一主键)或者Dim_Risk表里存在重复的Risk_ID+Insurance_Score组合,让连接后的结果产生了冗余行。下面给你两种靠谱的解决方案:

方案1:用DISTINCT快速去重

如果你的查询结果里存在完全重复的行(所有字段值都一模一样),直接在SELECT后加DISTINCT关键字就能让数据库自动过滤重复项,这是最简洁的处理方式:

SELECT DISTINCT
    s.Geography_Identifier,
    s.State_Code,
    s.State_Name,
    s.County_Name,
    s.City_Name,
    s.ZIP_Code,
    a.Risk_ID,
    a.Risk_Address,
    a.Latitude,
    a.Longitude,
    a.Distance_to_Coast,
    a.Insurance_Score
FROM [Policy].[Dim_Risk] AS a
INNER JOIN [Policy].[Fact_Monthly_Policy_Snap] AS b 
    ON b.Risk_ID = a.Risk_ID 
    AND b.Insurance_score = a.Insurance_Score
INNER JOIN [Common].[Dim_Geography] AS s 
    ON b.Risk_Geo_ID = s.Geography_Identifier

方案2:用窗口函数精准控制去重(更灵活)

如果结果里的重复行只是部分字段重复(比如同一个Risk_ID对应多条不同时间的快照记录,但你只需要取最新的那一条),用ROW_NUMBER()窗口函数会更可控。假设Fact_Monthly_Policy_Snap有Snapshot_Date字段,我们可以按Risk_ID分组,取每个组内最新的快照记录:

WITH RankedRisks AS (
    SELECT
        s.Geography_Identifier,
        s.State_Code,
        s.State_Name,
        s.County_Name,
        s.City_Name,
        s.ZIP_Code,
        a.Risk_ID,
        a.Risk_Address,
        a.Latitude,
        a.Longitude,
        a.Distance_to_Coast,
        a.Insurance_Score,
        -- 按Risk_ID分组,按快照日期倒序排名,最新的记录排第1
        ROW_NUMBER() OVER (PARTITION BY a.Risk_ID ORDER BY b.Snapshot_Date DESC) AS RowNum
    FROM [Policy].[Dim_Risk] AS a
    INNER JOIN [Policy].[Fact_Monthly_Policy_Snap] AS b 
        ON b.Risk_ID = a.Risk_ID 
        AND b.Insurance_score = a.Insurance_Score
    INNER JOIN [Common].[Dim_Geography] AS s 
        ON b.Risk_Geo_ID = s.Geography_Identifier
)
SELECT 
    Geography_Identifier,
    State_Code,
    State_Name,
    County_Name,
    City_Name,
    ZIP_Code,
    Risk_ID,
    Risk_Address,
    Latitude,
    Longitude,
    Distance_to_Coast,
    Insurance_Score
FROM RankedRisks
WHERE RowNum = 1 -- 只保留每个Risk_ID对应的第一条记录

额外排查小技巧

如果不确定重复行到底来自哪张表,可以先运行下面的查询定位问题:

-- 检查Dim_Risk里是否有重复的Risk_ID+Insurance_Score组合
SELECT Risk_ID, Insurance_Score, COUNT(*) AS RowCount
FROM [Policy].[Dim_Risk]
GROUP BY Risk_ID, Insurance_Score
HAVING COUNT(*) > 1;

-- 检查Fact_Monthly_Policy_Snap里是否有重复的Risk_ID+Insurance_Score组合
SELECT Risk_ID, Insurance_Score, COUNT(*) AS RowCount
FROM [Policy].[Fact_Monthly_Policy_Snap]
GROUP BY Risk_ID, Insurance_Score
HAVING COUNT(*) > 1;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:57:42