sql-server - 在 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
我不知道如何为此编写查询,请帮助 - 在此先感谢。
解决方案
假设我理解这个问题,这是一种方法:
;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)
推荐阅读
- html - 无法在 div 中传递 id 变量和在 html 中传递数据目标
- pandas - 无论数据是什么,pandas rolling(n).corr() 都停留在 1 上?
- javascript - Cloud Functions 如何嵌套 Promise
- python - 忽略命令无异常:discord.ext.commands.errors.CommandNotFound:找不到命令“memechannel”错误(discord.py)
- swing - 同步Java Canvas 实例的paint() 方法?
- mongodb - 启动备份 WiredTiger mongodb 数据库时出错
- php - 通过 PowerShell 从 JSON 数组中提取特定对象作为逗号分隔的字符串
- java - Java 将数据写入外部文件
- javascript - 从ajax请求php获取post数据
- python - python bs4.element.Tag 获取字典