mysql - 使用 MySQL 更新原始表的概率?

标签 mysql sql probability

source | target
apple  |   dog
dog    |   cat
door   |   cat
dog    |   apple
cat    |   dog              -----step 1.

使用 SQL 代码:

SELECT GREATEST(source,target),LEAST(source,target),COUNT(*) FROM my_table GROUP BY GREATEST(source,target),LEAST(source,target); 

将会

apple dog 2
dog   cat 2
door  cat 1                 ------step2.

所以我想计算概率并更新到名称调用“prob”列

喜欢

source | target | prob
apple  |   dog  | 2/(2+2+1)
dog    |   cat  | 2/(2+2+1)
door   |   cat  | 1/(2+2+1)
dog    |   apple| 2/(2+2+1)  
cat    |   dog  | 2/(2+2+1)    -------step3.

从第 1 步到第 3 步我该怎么做。

最佳答案

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(source VARCHAR(12) NOT NULL,target VARCHAR(12) NOT NULL
,PRIMARY KEY(source,target)
);
INSERT INTO my_table VALUES
('apple','dog'),
('dog','cat'),
('door','cat'),
('dog','apple'),
('cat','dog');

SELECT x.*
     , y.total/(SELECT COUNT(*) FROM my_table) prob 
  FROM my_table x
  JOIN 
     ( SELECT GREATEST(source,target) g,LEAST(source,target) l,COUNT(*) total FROM my_table GROUP BY g,l ) y
    ON (y.g = x.source AND y.l = x.target) 
    OR (y.g = x.target AND y.l = x.source);

+--------+--------+--------+
| source | target | prob   |
+--------+--------+--------+
| apple  | dog    | 0.4000 |
| dog    | apple  | 0.4000 |
| cat    | dog    | 0.4000 |
| dog    | cat    | 0.4000 |
| door   | cat    | 0.2000 |
+--------+--------+--------+

...或者类似的东西

关于mysql - 使用 MySQL 更新原始表的概率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25842371/

相关文章:

python - 逆加权分布

java - 将来自不同社交网络的 friend 列表合并到一个列表中的好算法?

java - SQL - 根据不同的属性获取任何行,不重复

php - MySQL 查询在连接表时返回重复行

java - 如何从PreparedStatementWrapper对象打印语句?

sql - 使用SAS sql创建宏变量

mysql - 内部加入超过 2 个表

mysql - 是否离线更改表mysql?

sql - 如何正确命名关联表(一对一关系)

python - 无法理解 sklearn 的 SVM 的 predict_proba 函数