Как пересечь две колонки в SQL Server
У меня есть таблица данных AC
в SQL Server со структурой как:
+----------+------------+-------+
| 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
из AuthorID
дано CoAuthorID
т.е.
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
Возвращается 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)
:
SELECT * FROM AC WHERE AuthorID = 677 AND Year = 2005
INTERSECT
SELECT * FROM AC WHERE CoAuthorID = 901706 AND Year = 2005
Возвращает 1 строку как:
AuthorID CoAuthorID Year
----------------------------
677 901706 2005
В то время как в данных есть 3 строки, это означает AuthorID
а также CoAuthorID
сосуществует в данных 3 раза в 2005
означает, что эти два Авторы внесли свой вклад 3 раза в 2005 году. Итак,
- Какой должна быть ценность для
P(AuthorID ∩ CoAuthorID)
? Должно ли это быть1
или же1/3
? - Также правильны ли другие расчеты?
Спасибо!
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 значения, а вам нужно только третье. Но это поможет в анализе результата, чтобы также включить два первых значения.
Первое значение подсчитывает каждое вхождение данного CoAuthorID в 2005 году ("match_records"), второе подсчитывает общее количество записей за 2005 год ("ised_records"), а третье делит первое на второе, чтобы получить вероятность.
В крайнем случае, все записи 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
Обратите внимание на модель, которая появляется: в общем, ограничение Y в P(X|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
это число или записи, для которых год 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=1361047
а также Year=2005
Неофициально: какая доля сотрудничества соавтора 1361047 была с автором 1359?
Количество рассмотренных коллабораций: 3, потому что этот соавтор сотрудничал только три раза в 2005 году
Количество подходящих коллабораций: 3, потому что этот соавтор трижды сотрудничал с этим автором в 2005 году (т.е. не сотрудничал ни с кем другим)
Вероятность: 3/3 = 1.
2. P(AuthorID=1359 ∩ CoAuthorID=1361047 | Year=2005)
Значение: какова вероятность того, что сотрудничество будет между AuthorID=1359
а также CoAuthor=1361047
когда дано, что Year=2005
Неофициально: какая доля сотрудничества была между автором 1359 и соавтором 1361047?
Количество рассмотренных коллабораций: 31, потому что в 2005 году
Количество подходящих коллабораций: 3, потому что этот автор и соавтор сотрудничали три раза в 2005 году
Вероятность: 3/31.
3. P(CoAuthorID=1361047 | AuthorID=1359 ∩ Year=2005)
Значение: какова вероятность CoAuthor=1361047
когда дано, что AuthorID=1359
а также Year=2005
Неофициально: какая доля сотрудничества автора 1359 была с соавтором 1361047?
Количество рассматриваемых коллабораций: 28, потому что этот автор сотрудничал 28 раз (с кем бы то ни было) в 2005 году
Количество подходящих коллабораций: 3, потому что этот автор трижды сотрудничал с этим соавтором в 2005 году
Вероятность: 3/28.
наблюдение
Обратите внимание на то, как похожи три вышеупомянутых предиката, но насколько они действительно различны. Точная формулировка важна. Возьмите, например, эту фразу:
Вероятность того, что автор A и соавтор B будут вместе в 2005 году
Видя это с точки зрения соавтора B, это 100%, потому что этот человек не был соавтором ни с кем другим (случай 1 выше). Но видение этого с точки зрения автора А отличается, так как этот человек сотрудничал также со многими другими соавторами (случай 3 выше), и поэтому вероятность меньше. Но это может быть даже истолковано ни с какой точки зрения: тогда можно было бы посмотреть на все коллаборации в 2005 году и увидеть, сколько раз это было между автором A и соавтором B (случай 2). Это опять другая вероятность.
Это показывает, что утверждения легко могут быть неоднозначными, и нужно быть осторожным, чтобы быть точным: что предполагается как данность? Это должно появиться после символа трубы в P(X|Y)
нотации.
EXCEPT возвращает отдельные строки из левого входного запроса, которые не выводятся правым входным запросом.
INTERSECT возвращает отдельные строки, которые выводятся как левым, так и правым входными запросами.
DISTINCT
Карл.
https://msdn.microsoft.com/en-us/library/ms188055(v=sql.120).aspx