在 SQL Server 中构建比较矩阵

2024-01-10

我有一个关于相当复杂的 SQL 查询的问题。 (我正在使用 sql server)在我的数据库中,我有一组类,以及这些类所具有的一组技能(处于多对多关系中)。

我想构建一个构建矩阵比较的查询(类似于如何使用 SQL 创建矩阵 https://stackoverflow.com/questions/11443070/how-to-create-a-matrix-with-sql) 但如果可能的话,不要对每一列进行硬编码。我希望通过以下方式比较每个类对的重叠量:

overlap = (Skills_Both_Classes_Have / Total_Skills) * 100

我的主要问题是如何以我可以修改/显示的方式找到每对类的重叠。

类表的格式:

|ClassID |   ClassName |
------------------------
|1       |    Class1   |
|2       |    Class2   |
|3       |    Class3   |

技能表的格式:

|SkillID |   SkillName |
------------------------
|1       |    Skill1   |
|2       |    Skill2   |
|3       |    Skill3   |

中位数表的格式:

|ClassID |SkillID|
------------------
|1       |   1   |
|1       |   2   |
|1       |   3   |
|2       |   2   |
|2       |   4   |
|2       |   5   |
|3       |   1   |
|3       |   2   |
|3       |   5   |

示例输出:

       |Class1 |Class2 |Class3 | 
--------------------------------
Class1 |  100  |  033  |  066  |
Class2 |  033  |  100  |  066  |
Class3 |  066  |  066  |  100  |

我一直在玩pivot之类的东西,但是我很难理解在SQL中实现这个的最佳方法。

在任何其他语言中,我会为每个循环使用几个循环,并将输出发送到数组中,但这在 SQL 中似乎不是一个很好的解决方案。这不是为了作业或其他什么,只是出于我个人的好奇心。


我设法编写了一个查询来获取我想要的内容,但并不像我想要的那么容易阅读。

--Builds a list of all combinations of classes
SELECT [ClassID], [ClassName] INTO #classnames FROM [Glad1].[dbo].[Classes] 
SELECT a.classname AS Class1, a.ClassID AS Class1ID, b.classname AS Class2, b.ClassID AS    Class2ID INTO #combos 
FROM #classnames a cross join #classnames b
SELECT Classes.ClassName,COUNT(*) AS SkillCount INTO #skillcounts FROM [Glad1].[dbo].[ClassSkills]
RIGHT JOIN [Glad1].[dbo].[Classes]
ON ClassSkills.ClassID=Classes.ClassID
GROUP BY ClassName


--Finds the percent overlap for each class combination
SELECT ClassOne, ClassTwo,CAST(ROUND(((SharedSkills * 2.0) / (sc1.skillCount + sc2.SkillCount) * 100.0),0) AS DECIMAL(8,0)) 
AS PercentOverlap INTO #percentoverlaps FROM
(SELECT cn1.ClassName AS ClassOne, cn2.ClassName AS ClassTwo, SharedSkills FROM #classnames cn1 JOIN
(SELECT Class1ID, Class2ID, Count(Class1Skills.[SkillID]) AS SharedSkills FROM
(SELECT DISTINCT [Class1ID],[SkillID] FROM [Glad1].[dbo].[ClassSkills] 
JOIN #combos ON #combos.Class1ID = ClassSkills.ClassID) Class1Skills
INNER JOIN
(SELECT DISTINCT [Class2ID], [SkillID] FROM [Glad1].[dbo].[ClassSkills] 
JOIN #combos ON #combos.Class2ID = ClassSkills.ClassID) CLass2Skills
ON Class1Skills.[SkillID] = Class2Skills.[SkillID]
Group by Class1ID, CLass2ID
) AllSharedSkills
ON cn1.ClassID = Class1ID
JOIN #classnames cn2
ON cn2.ClassID = Class2ID) Named
JOIN #skillcounts sc1
ON sc1.ClassName = ClassOne
JOIN #skillcounts sc2
ON sc2.ClassName = ClassTwo

--Dynamically builds the columns to turn the results into a matrix of percent overlap
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.ClassTwo) 
            FROM #percentoverlaps c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ClassOne, ' + @cols + ' from 
            (
                select ClassOne, ClassTwo, PercentOverlap
                from #percentoverlaps
           ) x
            pivot 
            (
                 max(PercentOverlap)
                for ClassTwo in (' + @cols + ')
            ) p '


execute(@query)



--cleans up temp tables
DROP TABLE #classnames
DROP TABLE #combos
DROP TABLE #skillcounts
DROP TABLE #percentoverlaps
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SQL Server 中构建比较矩阵 的相关文章

随机推荐

  • MySql:限制一张表中某一列的更新权限

    我有一个表 我们称之为学生表 其模式称为注册 表学生有一个名为地址的列 我不希望某个用户更新该列 其他权限都可以 例如选择 插入 该表中以及该架构中的所有其他列都应该具有更新权限 这可行吗 您可以设置数据库 表 列的权限 但我真的不会尝试在
  • 艾里函数积分的根(matlab)

    我想解下面的方程 我在函数的定义上做错了 但我仍然不明白 function F myairyint x F integral x airy x 1000 end functi2 x myairyint x0 1 1 15 fsolve fu
  • 如何以可微分的方式计算几何平均值?

    如何使用 Pytorch 计算沿某个维度的几何平均值 有些数字可能是负数 该函数必须是可微的 几何平均值的已知 合理 数值稳定版本是 import torch def gmean input x dim log x torch log in
  • 有没有办法将通用列表转换为接口/基类类型列表?

    我试图向某人展示接口在他们创建的疯狂情况下的用途 它们在列表中有几个不相关的对象 并且需要对每个对象中的两个字符串属性执行操作 我指出 如果他们将属性定义为接口的一部分 他们可以使用接口对象作为作用于它的方法参数的类型 例如 void Pr
  • AES 加密和密钥存储?

    几年前 当我第一次接触 ASP net 和 NET Framework 时 我构建了一个非常简单的在线文件存储系统 该系统使用 Rijndael 加密来存储服务器硬盘上的加密文件 并使用 HttpHandler 来解密并将这些文件发送到客户
  • 手动编辑 Excel 365 并使用图形 API 延迟读取

    我有一个 Excel 在线文档 用户可以在 Excel 365 Web 应用程序中编辑该文档 我有一个使用图形 API 读取此 Excel 文件的应用程序 我已经成功地从文件中读取数据 但是当用户更改 Excel 文件并且 Excel 表示
  • 是否可以在 Rx 中的不同线程上调用订阅者的 OnNext?

    我是 Rx 新手 我想知道是否可以将消息分派给不同的订阅者 以便它们在不同的线程上运行 IObserable 如何控制它 据我了解 简单的主题实现是在单个线程上一个接一个地调用订阅者 public class Subsciber IObse
  • PostgreSQL整数数组值使用desc字符串连接到其他表中的整数

    我有一张桌子test包含 int 数组和值的列 例如 1000 4000 6000 or 1000 or 1000 4000 called ekw 这些值与另一个表中的描述字符串匹配 tab test id name ekw 1 One 1
  • 索引 Pandas 数据帧时出现 KeyError

    我正在尝试将 csv 文件中的数据读取到 pandas 数据框中 并访问第一列 日期 import pandas as pd df ticks pd read csv values csv delimiter print df ticks
  • git show HEAD^ 似乎不起作用。这是正常的吗?

    我正在使用 Zsh 并尝试为项目运行 git show 以查看我的修订历史记录 如果我做 git show HEAD 它可以很好地向我显示我的最后一次提交 但是以下命令不起作用 master 5 project git show HEAD
  • 如何在 Google Datastore 中添加复合索引?

    我现在使用 Google Datastore 作为我公司的数据库 今天 我做了一个索引 它成功地列在 索引 中 但是我创建的索引的大小和实体是空的 谷歌数据存储的文档说索引是自动生成的 但事实并非如此 是否有任何命令或执行某些操作来生成索引
  • 简单的社区网站是否需要 SSL 证书?

    我正在努力部署一个小型社区网站 用户注册只需要用户名 电子邮件地址和密码 我什至不要求提供姓名 当然也不会存储任何敏感数据 我还应该投资 SSL 证书吗 在没有密码的情况下传输用户密码会被认为是一种糟糕的做法吗 这只是一个个人项目 所以我想
  • 适用于 Android 的 REST API 客户端库

    我们正在构建一个基于位置的消息应用程序 它使用 Parse com 作为后端 Parse com 类似于 Urban Airship PubNub 等 我们现在想要切换到我们自己的后端以获得更好的控制 为此 我们构建了一个基于 Node j
  • 如何使用 Firestore 查询的结果填充微调器?

    我正在创建一个spinner这将显示主题名称 主题名称存储在我的 Firestore 数据库中 如下所示 subjects collection SUB01 document name Android SUB02 name Java 我可以
  • 在注释功能中设置箭头和文本之间的垫

    如何在 matplotlib 的注释函数中设置箭头和文本之间的距离 填充 有时 文本最终距离箭头太近 我想将它们移得更远一些 基本示例 import matplotlib pyplot as plt plt annotate Here it
  • RavenDB Id 和 ASP.NET MVC3 路由

    只是使用 MVC 3 RC2 和 RavenDB 构建一个快速 简单的站点来测试一些东西 我已经能够制作一堆项目 但我很好奇 Html ActionLink 如何处理 raven DB ID 我的例子 我有一个名为 reasons 的文档
  • 在进行文本相似度评分时如何矢量化和加速 pandas 数据帧的双 for 循环

    我有以下数据框 d test name South Beach Dog Bird Ant Big Dog Beach Dear Cat cluster number 1 2 3 3 2 1 4 2 df test pd DataFrame
  • 为什么 Python 3 发现这个 ISO8601 日期:“2019-04-05T16:55:26Z”无效?

    我供应 2019 04 05T16 55 26Z 到 Python 3datetime datetime fromisoformat并得到Invalid isoformat string 尽管相同的字符串在没有 Z 的情况下也可以工作 IS
  • 在 VisualStudio UI 设计器中查看 XAML 文件会执行文件后面的代码吗?

    请幽默一下我 因为我可能疯了 在 Visual Studio UI 设计器中查看 xaml 是否会执行代码隐藏文件 过去 每当我尝试查看 WPF 应用程序的主 xaml 文件时 它都会引发异常 但因为我一直忙于其他事情 所以直到今天我才真正
  • 在 SQL Server 中构建比较矩阵

    我有一个关于相当复杂的 SQL 查询的问题 我正在使用 sql server 在我的数据库中 我有一组类 以及这些类所具有的一组技能 处于多对多关系中 我想构建一个构建矩阵比较的查询 类似于如何使用 SQL 创建矩阵 https stack