如何将 SQL 服务器中的两列相交

How to INTERSECT two columns in SQL Server

我的数据 table AC 在 SQL 服务器中,结构如下:

+----------+------------+-------+
| AuthorID | CoAuthorID | Year  |
+----------+------------+-------+
|  677     | 901706     |  2005 |
|  677     | 901706     |  2005 |
|  677     | 901706     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 266386     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 578338     |  2005 |
|  1359    | 721615     |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  ...     |            |       |
|  ...     |            |       |
+----------+------------+-------+

我必须计算给定 CoAuthorID AuthorID 的每年 Conditional Probability,即

P(AuthorID|CoAuthorID) = P(AuthorID ∩ CoAuthorID) / P(CoAuthorID)

而在 2005 年是交集操作。

最初,例如,AuthorID = 677CoAuthorID = 901706Year = 2005,我试过这个:

对于P(AuthorID)

SELECT COUNT(DISTINCT AuthorID) FROM AC WHERE Year = 2005  

它returns390所以P(AuthorID)=1/390

P(CoAuthorID)

SELECT COUNT(DISTINCT CoAuthorID) FROM AC WHERE AuthorID = 677 AND Year = 2005

它returns1所以P(CoAuthorID)=1/1

P(AuthorID ∩ CoAuthorID)

SELECT * FROM AC WHERE AuthorID = 677 AND Year = 2005
INTERSECT 
SELECT * FROM AC WHERE CoAuthorID = 901706 AND Year = 2005

它returns 1行为:

AuthorID    CoAuthorID  Year
----------------------------
677         901706      2005

而数据中有3行,这意味着AuthorIDCoAuthorID在数据中共存3次 2005意味着这两个作者一起贡献了3次2005. 所以,

  1. P(AuthorID ∩ CoAuthorID) 的值应该是多少?应该是 是 1 还是 1/3
  2. 还有其他计算是否正确?

谢谢!

EXCEPT returns distinct rows from the left input query that aren’t output by the right input query.

INTERSECT returns distinct rows that are output by both the left and right input queries.

DISTINCT,卡尔.

https://msdn.microsoft.com/en-us/library/ms188055(v=sql.120).aspx

这个公式有点正确:

P(AuthorID|CoAuthorID) = P(AuthorID ∩ CoAuthorID) / P(CoAuthorID) 

尽管您还应该指定年份约束以更准确:

P(AuthorID|CoAuthorID ∩ Year) = P(AuthorID ∩ CoAuthorID|Year)/P(CoAuthorID|Year)

您给出了 P(AuthorID)(或者实际上是 P(AuthorID|Year))的计算结果,但是该项没有出现在上面的公式中,因此它没有用。

其次,你不应该使用DISTINCT。如果同一作者多次出现,则应认为该作者的概率高于另一个不太频繁出现的作者的概率。通过使用 DISTINCT,您将忽略这些不同的频率,并为每个作者分配相同的概率。这不是本意。

相反,您可以按如下方式识别这些概率:

P(CoAuthorID|Year)

使用这个 SQL 得到那个概率(在 0 和 1 之间):

SELECT SUM(CASE 
              WHEN CoAuthorID = 901706 THEN 1 
           END)       AS matching_records,
       COUNT(*)       AS considered_records,
       CAST(SUM(CASE 
              WHEN CoAuthorID = 901706 THEN 1 
           END) AS FLOAT)
           / COUNT(*) AS probability  
FROM   AC 
WHERE  Year = 2005

这 return 实际上有 3 个值,而您只需要第三个。但这将有助于分析结果,同时包括前两个值。

第一个值计算 2005 年给定 CoAuthorID 的每次出现次数 ("matching_records"),第二个值计算 2005 年 条记录数 ("considered_records") 第三个用第一个除以第二个得出概率。

极端情况下,2005年的所有记录都可能有这个CoAuthorID,那么概率就是return1.

P(AuthorID ∩ CoAuthorID|Year)

同样,您可以通过以下方式获取此概率:

SELECT SUM(CASE 
              WHEN AuthorID = 677 AND CoAuthorID = 901706 THEN 1 
           END)       AS matching_records,
       COUNT(*)       AS considered_records,
       CAST(SUM(CASE 
              WHEN AuthorID = 677 AND CoAuthorID = 901706 THEN 1 
           END) AS FLOAT)
       / COUNT(*)     AS probability  
FROM   AC 
WHERE  Year = 2005

注意正在出现的模式:通常,P(X|Y) 中的约束 Y 出现在 WHERE 子句中,而 X 表示在 CASE WHEN 子句中。

P(AuthorID|CoAuthorID ∩ Year)

虽然您可以使用前两个查询的结果,但您可以选择更直接的方式,使用 P(AuthorID|CoAuthorID ∩ Year):

的模式
SELECT SUM(CASE 
              WHEN AuthorID = 677 THEN 1 
           END)       AS matching_records,
       COUNT(*)       AS considered_records,
       CAST(SUM(CASE 
              WHEN AuthorID = 677 THEN 1 
           END) AS FLOAT)
       / COUNT(*)     AS probability  
FROM   AC 
WHERE  Year = 2005
AND    CoAuthorID = 901706 

第一个问题的答案

What should be the value for P(AuthorID ∩ CoAuthorID)? Should it be 1 or 1/3?

由于您的数据中有 3 行 AuthorId、CoAuthorID 和 Year 匹配,因此 P(AuthorID ∩ CoAuthorID|Year)3/num_records,其中 num_records 是 Year 对应的数字或记录2005.

请注意,INTERSECT 具有消除结果中重复项的副作用。我上面写的关于 DISTINCT 的内容也适用于这里:处理概率时需要计算重复项。

附录:一些示例结果

鉴于此数据:

+----------+------------+-------+
| AuthorID | CoAuthorID | Year  |
+----------+------------+-------+
|  677     | 901706     |  2005 |
|  677     | 901706     |  2005 |
|  677     | 901706     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 133112     |  2005 |
|  1359    | 266386     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 454557     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 534423     |  2005 |
|  1359    | 578338     |  2005 |
|  1359    | 721615     |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1016805    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361047    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1361320    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1395982    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
|  1359    | 1412785    |  2005 |
+----------+------------+-------+

我们可以看看以下概率:

1。 P(AuthorID=1359 | CoAuthorID=1361047 ∩ Year=2005)

含义: 给定CoAuthor=1361047Year=2005AuthorID=1359的概率是多少

非正式地: 2005 年,合著者 1361047 与作者 1359 合作的比例是多少?

合作次数考虑:3,因为这位合著者在 2005 年只合作了 3 次

匹配的合作次数:3,因为该合著者在 2005 年与该作者合作了 3 次(即没有与其他任何人合作)

概率: 3/3 = 1.

2。 P(AuthorID=1359 ∩ CoAuthorID=1361047 | Year=2005)

含义: 当给定Year=2005

非正式地: 2005 年,作者 1359 和合著者 1361047 之间的合作比例是多少?

考虑的合作数量:31,因为 2005 年有 31 次合作

匹配的合作次数:3,因为作者和合著者在 2005 年合作了 3 次

概率: 3/31.

3。 P(CoAuthorID=1361047 | AuthorID=1359 ∩ Year=2005)

含义: 给定AuthorID=1359Year=2005CoAuthor=1361047的概率是多少

非正式地: 2005 年,作者 1359 与合著者 1361047 的合作有多少?

合作次数考虑:28,因为这位作者在 2005 年合作了 28 次(与任何人)

匹配的合作次数:3,因为该作者在 2005 年与该合著者合作了 3 次

概率: 3/28.

观察

请注意以上三个谓词听起来多么相似,但实际上却有多么不同。准确的措辞很重要。以这个短语为例:

2005年作者A和合著者B在一起的概率

从合著者B的角度来看是100%,因为这个人没有和其他人合着(上面的案例1)。但是从作者A的角度来看就不一样了,因为那个人还和很多其他合作作者合作过(上面的案例3),所以概率更小。但它甚至可以从任何人的角度来解释:那么人们可以查看 2005 年的所有合作,看看作者 A 和合著者 B 之间有多少次合作(案例 2)。这又是一个概率。

这表明陈述很容易模棱两可,必须注意准确:假设什么是给定的?它必须出现在 P(X|Y) 表示法中的管道符号之后。