如何将 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 = 677
和CoAuthorID = 901706
和Year = 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行,这意味着AuthorID
和CoAuthorID
在数据中共存3次 2005
意味着这两个作者一起贡献了3次2005. 所以,
P(AuthorID ∩ CoAuthorID)
的值应该是多少?应该是
是 1
还是 1/3
?
- 还有其他计算是否正确?
谢谢!
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=1361047
和Year=2005
AuthorID=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=1359
和Year=2005
CoAuthor=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)
表示法中的管道符号之后。
我的数据 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 = 677
和CoAuthorID = 901706
和Year = 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行,这意味着AuthorID
和CoAuthorID
在数据中共存3次 2005
意味着这两个作者一起贡献了3次2005. 所以,
P(AuthorID ∩ CoAuthorID)
的值应该是多少?应该是 是1
还是1/3
?- 还有其他计算是否正确?
谢谢!
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 be1
or1/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=1361047
和Year=2005
AuthorID=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=1359
和Year=2005
CoAuthor=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)
表示法中的管道符号之后。