使用评分在 SQL 中查找最佳匹配

2023-12-26

假设我有一个数据表,例如:

ID | Col1 | Col2 | Col3
 1    a      b      23
 2    a      c      14
 3    f      g      11

假设我有一个 POSSIBLE_MATCHES 表,例如:

MatchID  | Col1 | Col2 | Col3
101         a      a      11
102         a      b      11
103         a      b      14
104         a      c      23
105         f      a      1

假设我有一个 WEIGHTS 表(如果您想为了讨论和简单起见假设所有权重均为 1 - 我可以稍后临时改进我的解决方案以合并权重):

Col | Weight
Col1    1
Col2    1.5
Col3    2

因此,对于每个可能的匹配,我们将计算SCORE在每个匹配的列上。

    Score = Col1 Weight * (CASE WHEN DATA.COL1 = POSSIBLE_MATCHES.Col1 THEN 1 ELSE 0) + 
            Col2 Weight * (CASE WHEN DATA.COL2 = POSSIBLE_MATCHES.Col2 THEN 1 ELSE 0) +
            Col3 Weight * (CASE WHEN DATA.COL3 = POSSIBLE_MATCHES.Col3 THEN 1 ELSE 0)

例如最佳匹配对于第一行:Col1 = a,Col2 = b,Col3 = 23:

MatchID  | Col1 | Col2 | Col3 | Score
101         a      a      11     1*1 + 1.5*0 + 2*0 = 1
102         a      b      11     1*1 + 1.5*1 + 2*0 = 2.5
103         a      b      14     1*1 + 1.5*1 + 2*0 = 2.5
104         a      c      23     1*1 + 1.5*0 + 2*1 = 3
105         f      a      1      1*0 + 1.5*0 + 2*0 = 0

因此,在这种情况下,ID:1 的最佳匹配是 MatchID:104。如果分数相同则取最低的MatchID。

如果你想尝试一下,这里有一个 sql 小提琴:http://sqlfiddle.com/#!6/9df45/1 http://sqlfiddle.com/#!6/9df45/1

对于 DATA 中的每个 ID,我如何在可能的匹配中找到最佳匹配?


在此解决方案中,我们进行完全连接以获取所有可能性并评估所有可能性的分数。然后,我们用 ROW_NUMBER 从最好到最低为它们分配一个数字。最后,我们排除所有那些不是“WHERE Rank = 1”的最佳者

SELECT * 
FROM 
(SELECT data.ID,
        possible_matches.MatchID,
        Score =  (CASE WHEN data.Col1 = possible_matches.Col1 THEN 1 ELSE 0 END) * 1 +
                (CASE WHEN data.Col2 = possible_matches.Col2 THEN 1 ELSE 0 END) * 1.5 +
                (CASE WHEN data.Col3 = possible_matches.Col3 THEN 1 ELSE 0 END) * 2,
        [Rank] = ROW_NUMBER() OVER(PARTITION BY data.ID ORDER BY (CASE WHEN data.Col1 = possible_matches.Col1 THEN 1 ELSE 0 END) * 1 +
                                                            (CASE WHEN data.Col2 = possible_matches.Col2 THEN 1 ELSE 0 END) * 1.5 +
                                                            (CASE WHEN data.Col3 = possible_matches.Col3 THEN 1 ELSE 0 END) * 2 DESC)
from data, possible_matches) AS AllScore
WHERE AllScore.[Rank] = 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用评分在 SQL 中查找最佳匹配 的相关文章

  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • 选择具有 SQL Server XML 列类型的特定行

    我正在尝试从类似于以下定义的表中选择数据 Column Data Type Id Int DataType Int LoggedData XML 但我只想选择具有特定 DataType 值并且在 LoggedData 列中包含字符串 或评估
  • 用更轻的解决方案替换完整的 ORM(JPA/Hibernate):推荐的加载/保存模式?

    我正在开发一个新的 Java Web 应用程序 并且正在探索保存数据的新方法 对我来说是新方法 我主要有 JPA 和 Hibernate 的经验 但是 除了简单的情况之外 我认为这种完整的 ORM 可能会变得相当复杂 另外 我不太喜欢和他们
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 月份增量查询

    我想通过添加 1 个月来更新数据库中的月份 但我不知道如何在以下存储过程查询中添加月份 我不擅长 sql 请检查它 ALTER PROCEDURE dbo ChangePassword password varchar 20 epasswo
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 计算运行总计时出错(之前期间的累计)

    我有一张桌子 我们称之为My Table有一个Created日期时间列 在 SQL Server 中 我试图提取一个报告 该报告显示历史上有多少行My Table按月在特定时间 现在我知道我可以显示有多少added每个月 SELECT YE
  • 如何使用sql作为xml路径('')但保留回车符

    我有下面的代码 select select cast Narrative as Varchar max char 13 from officeclientledger where ptmatter matter and ptTrans 4
  • 执行带有 EXCEPTION 的 PostgreSQL 查询会导致两条不同的错误消息

    我有一个 PostgreSQL 查询 其中包含事务和列重复时的异常 BEGIN ALTER TABLE public cars ADD COLUMN top speed text EXCEPTION WHEN duplicate colum
  • C#的数组列表可以用来填充SSIS对象变量吗?

    我已在 C 脚本中填充了一个列表 并将其值分配给 SSIS 对象变量 然后 我使用该对象变量通过循环遍历 For every do 枚举器来执行一些 SQL 查询 我尝试通过 Foreach ado 枚举器执行此操作 但出现错误 X 变量不
  • 临时表是线程安全的吗?

    我正在使用 SQL Server 2000 它的许多存储过程广泛使用临时表 数据库的流量很大 我担心创建和删除临时表的线程安全性 假设我有一个存储过程 它创建了一些临时表 它甚至可以将临时表连接到其他临时表等 并且还可以说两个用户同时执行存
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • 可以获取SQL Server中当前执行的存储过程的行号吗?

    几年前 我在 Sybase Delphi 环境中工作 使用 BDE 连接到数据库服务器 我们有一个 Delphi 小应用程序 给定当前正在执行的存储过程的名称 它可以告诉您当前正在执行该存储过程的哪一行 这对于调试似乎挂起的存储过程非常有用
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这

随机推荐

  • 检查是否包含 jQuery

    我正在制作几个小部件 这些小部件可以单独或成对包含 并且没有特定的顺序 我确保使用以下脚本加载 jQuery if typeof jQuery undefined alert about to load jquery var esm scr
  • 将 --process-dependency-links 与 pip 一起使用的替代方法是什么

    我正在使用Python 2 7 我在尝试着pip install一个仓库 在内部 github 上 依赖于另一个仓库 也在内部 github 上 我尝试了几种选择 但有效的一种是这样的 env abc cat requirements tx
  • 通过物理鱼眼相机和 Open CV 的虚拟 PTZ 相机

    我正在尝试基于物理鱼眼相机 180 度 FOV 的数据来实现虚拟平移倾斜变焦 PTZ 相机 在我看来 我必须实现下一个序列 获取鱼眼传感器矩阵坐标中鱼眼圆心的坐标 获取同一坐标系下鱼眼圆的半径 生成一个球体方程 该方程与平面相机传感器上的平
  • 使用 Swift PFIdResultBlock 错误解析云

    PFCloud callFunctionInBackground hello withParameters test tester response AnyObject error NSError gt Void in if error n
  • 活动启动延迟(startActivity)错误

    最近 我收到用户发来的信息 称我的闹钟应用程序没有在该响的时候响 最后 其中一位用户向我发送了来自构建日志的信息 这真的很奇怪 74 4 25 0 StartAlarm received 75 5 22 15 AlarmOnScreen c
  • 绑定字符串格式数字逗号且无小数位

    好吧 这是一个简单的问题 但我非常感谢你的帮助 因为我已经花了一个小时试图让它工作 如何更改以下内容以去掉小数位并仅显示整数 Binding Binding ANLA StringFormat n 我知道格式是这样的 0 0 0 但我无法让
  • static_cast 从 Derived* 到 void* 到 Base*

    我想将一个指向派生类成员的指针转换为void 并从那里指向基类的指针 如下例所示 include
  • 生成随机字母字符串的有效方法?

    我想要一个随机字母表中所有字符的字符串 现在 我创建一个包含 26 个字符的可变数组 使用 ExchangeObjectAtIndex 方法对它们进行打乱 然后将每个字符添加到我返回的字符串中 必须有更好的方法来做到这一点 这是我的代码 N
  • 重写 hashcode 方法时的 HashMap 性能

    In a HashMap 如果我将自定义对象作为键 如果我重写会发生什么hashCode 方法并实现它以将值传递为 1 会有任何性能影响吗 如果我改变hashCode 使用返回随机值的方法Math random 功能 性能会发生什么变化 添
  • 如何在 Python 中将 MP3 转换为 WAV

    如果我有 MP3 文件 如何将其转换为 WAV 文件 最好使用纯Python方法 我维护一个开源库 pydub http pydub com 这可以帮助您解决这个问题 from pydub import AudioSegment sound
  • C++中将一个类对象分配给另一个类对象

    我想在 C 中将一个类对象分配给另一个类对象 Ex 有一个类别为 狗 另一个类别为 猫 为每个 d1 c1 创建一个实例 不想使用任何STL 我想在我的代码中使用这个语句 d1 c1 Program class dog char dc fl
  • jQuery + RGBA 彩色动画

    有谁知道 jQuery 是否可以处理如下动画 rgba 0 0 0 0 2 rgba 0 255 0 0 4 我知道有一个plugin http github com jquery jquery color blob master jque
  • 无法使用 dart:ffi 在 Flutter 中使用编译后的 C 文件

    我正在尝试使用 C 代码并在 flutter 中调用 main 方法 我不确定我们是否可以在 flutter 中执行此操作 我编译了C文件 没问题 当我在 dart 文件中使用它并使用命令运行它时 dart myDartCode dart
  • 从名称作为变量传递的表中进行选择

    我正在尝试编写一个简单的存储过程 它采用三个参数 数据库名称一 数据库名称二 和 表名称 然后 sql 将对每个数据库中定义的表执行行计数并存储它 零碎地工作我遇到了你做不到的第一个问题 select from tablename 我知道你
  • Azure 网站上的 SQLXML

    我的应用程序正在使用库 SqlXML 并且我正在尝试将此应用程序发布到 Azure Web 服务 发布后我收到此错误 Retrieving the COM class factory for component with CLSID 83D
  • 调车场算法及功能调试

    我想在调车场算法中除了运算符之外实现 函数 并根据结果算法做一个小解释器 但是 默认算法会忽略标记的语法错误使用 有没有人写过一个解释器 或不想 想帮助我 这将帮助很多陷入这个问题的人 这里列出了一些测试 shunting yard 函数忽
  • Powershell - 创建计划任务作为本地系统/服务运行

    谁能告诉我如何使用作为本地系统或本地服务运行的 powershell 创建计划任务 除了对 ITaskFolder RegisterTaskDefinition 的调用之外 一切都运行良好 如果我传入 null 或 则调用炸弹会说用户名或密
  • 如何将 activerecord 结果转换为哈希值?

    我有一个查询成功返回 ActiveRecord 中的结果 select trunc b transaction date as transaction date sum a transaction amount as transaction
  • Gradle 是否支持 Ivy 存储库的分类器?

    我正在尝试基于分类器从 Ivy 存储库 在 Artifactory 中 检索 Gradle 依赖项 以过滤包含本机代码的 DLL 以获取相关处理器架构的 DLL 我的 build gradle 看起来像这样 repositories ivy
  • 使用评分在 SQL 中查找最佳匹配

    假设我有一个数据表 例如 ID Col1 Col2 Col3 1 a b 23 2 a c 14 3 f g 11 假设我有一个 POSSIBLE MATCHES 表 例如 MatchID Col1 Col2 Col3 101 a a 11