首页 > 解决方案 > 在 MS SQL 中获取连接的最佳匹配

问题描述

我想从 Ms SQL 查询中获取结果,按最佳匹配排序。这意味着我有两个这样的表

CREATE TABLE #Leads(
    Id          INT IDENTITY(1,1),
    LeadId      INT,
    PlanId      INT,
    RegionCode  VARCHAR(20),
    FuelType    VARCHAR(20)
)

CREATE TABLE #Discounts(
    Id              INT IDENTITY(1,1),
    PlanId          INT,
    RegionCode      VARCHAR(20),
    FuelType        VARCHAR(20),
    DiscountPercent DECIMAL(6,3)
)

这些表具有以下值,如下所示

INSERT INTO #Leads([LeadId], [PlanId], [RegionCode], [FuelType])
    VALUES (1,1,'HR26', 'Petrol'),  
           (2,2,'HR30', 'Diesel')

INSERT INTO #Discounts ([PlanId], [RegionCode], [FuelType], [DiscountPercent])
                VALUES (1, null, null, 20),
                       (2, null, null, 10),
                       (2, 'HR30', null, 15),
                       (2, null, 'Diesel', 20),
                       (2, 'HR30', 'Diesel', 25)

因此,如果我们届时将#leads表与#discounts表连接起来PlanId-

因为Plan 1我们没有多个折扣条目,所以我们将选择第一个20%

但是对于计划 2,我们得到的数据是:-

案例 1:我们现在有多个计划 2 的折扣条目,当前案例应该选择 25%,因为RegionCode两者FuelType都与潜在客户匹配。

案例 2:如果我更新Plan 2潜在客户并更改RegionCode to NULL(或折扣表中不匹配的任何值Plan 2),那么它应该选择20%.

案例 3:如果我更新Plan 2潜在客户和更改FuelType to NULL(或折扣表中不匹配的任何值Plan 2)和 RegionCode,HR30那么它应该选择15%

案例4:如果我将它们都更改为NULL(或折扣表中不匹配的任何值Plan 2),那么它应该选择10%.

我想要最好的匹配Plan2

我不知道如何为此编写查询,请帮助 - 在此先感谢。

标签: sql-serverdatabase

解决方案


假设我理解这个问题,这是一种方法:

;WITH CTE AS
(
SELECT  LeadID, 
        (
        CASE WHEN l.RegionCode = d.RegionCode THEN 1 ELSE 0 END
        + CASE WHEN l.FuelType = d.FuelType THEN 1 ELSE 0 END
        -- + more of the same here
        ) As Match,    
        d.DiscountPercent
FROM #Leads As l
JOIN #Discounts As d
    ON l.PlanId = d.PlanId
)

SELECT TOP 1 WITH TIES LeadID, DiscountPercent
FROM CTE
ORDER BY ROW_NUMBER() OVER(PARTITION BY LeadID ORDER BY Match DESC)

推荐阅读