如何在SQL Server中交叉两列

时间:2016-03-05 09:03:41

标签: sql-server conditional probability intersection independent-set

我在SQL Server中有我的数据表AC,其结构为:

+----------+------------+-------+
| 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 |
|  ...     |            |       |
|  ...     |            |       |
+----------+------------+-------+

我必须计算给定Conditional Probability的{​​{1}}年AuthorID,即

CoAuthorID = P(AuthorID|CoAuthorID)

在年份P(AuthorID ∩ CoAuthorID) / P(CoAuthorID)中,它是一个交叉点操作。

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

Year = 2005

P(AuthorID)

它返回SELECT COUNT(DISTINCT AuthorID) FROM AC WHERE Year = 2005 ,因此390 = P(AuthorID)

1/390

P(CoAuthorID)

它返回SELECT COUNT(DISTINCT CoAuthorID) FROM AC WHERE AuthorID = 677 AND Year = 2005 ,因此1 = P(CoAuthorID)

1/1

P(AuthorID ∩ CoAuthorID)

它返回1行:

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

虽然数据中有3行,但AuthorID CoAuthorID Year ---------------------------- 677 901706 2005 AuthorID在数据中共存3次CoAuthorID意味着这两位作者在2005年共同贡献了3次。所以,

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

2 个答案:

答案 0 :(得分:2)

这个公式有点正确:

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

这实际上返回3个值,而您只需要第三个值。但它有助于分析结果,也包括两个第一个值。

第一个值计算2005年给定CoAuthorID的每次出现次数(" matching_records"),第二个值计算2005年的记录数(" Conside_records&# 34;)和第三个将第一个除以第二个到达概率。

在一个极端情况下,所有2005年的记录都可能有这个CoAuthorID,然后概率将返回1.

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 

回答第一个问题

  

P(AuthorID ∩ CoAuthorID)的价值应该是多少?它应该是1还是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)

含义: AuthorID=1359 CoAuthor=1361047Year=2005

的概率为P(AuthorID=1359 ∩ CoAuthorID=1361047 | Year=2005)的概率是多少

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

合作次数被视为:3,因为此合着者仅在2005年合作了三次

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

概率: 3/3 = 1。

2。 AuthorID=1359

含义: CoAuthor=1361047 给定Year=2005P(CoAuthorID=1361047 | AuthorID=1359 ∩ Year=2005)之间合作的概率是多少>

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

合作次数被视为:31,因为2005年有31次合作

匹配的合作次数:3,因为这位作者和合着者在2005年合作了三次

概率: 3/31。

3。 CoAuthor=1361047

含义: AuthorID=1359 Year=2005P(X|Y)

的概率为{{1}}的概率是多少

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

合作次数被视为:28,因为该作者在2005年与任何人合作了28次

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

概率: 3/28。

观察

请注意上述三个谓词听起来有多相似,但它们实际上有多么不同。确切的措辞很重要。以这句话为例:

作者A和共同作者B在2005年合在一起的可能性

从共同作者B的观点来看,这是100%,因为这个人没有与任何其他人共同作者(上述案例1)。但是从作者A的观点来看这是不同的,因为那个人也与许多其他共同作者合作(上面的案例3),因此概率更小。但它甚至可以从无人的角度来解释:然后人们可以看看2005年的所有合作,看看作者A和共同作者B之间有多少次合作(案例2)。这又是另一种可能性。

这表明陈述很容易含糊不清,必须小心谨慎:假设什么是给定的?这必须出现在{{1}}表示法中的管道符号之后。

答案 1 :(得分:0)

  

EXCEPT返回左输入查询中不是的不同行   通过正确的输入查询输出。

     

INTERSECT返回左侧和右侧输出的不同行   正确的输入查询。

DISTINCT,Karl。

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