SQL 生成完整概率结果列表的查询
SQL query for generating a full list of Probability outcomes
假设我有一个 table 看起来像这样:
CREATE TABLE student
(
name CHAR NOT NULL,
Pwin numeric(5,2) NOT NULL
)
INSERT INTO student
VALUES ('A', 0.5),
('B', 0.7),
('C', 0.6)
这代表 3 名学生参加不同的项目。他们每个人都有赢得比赛的概率 (Pwin)。这些事件彼此独立。他们输掉比赛的概率就是= 1 - Pwin.
有 8 种可能的结果
Awin Bwin Cwin
Awin Bwin Close
Awin Blose Cwin
Awin Blose Close
Alose Bwin Cwin
Alose Bwin Close
Alose Blose Cwin
Alose Blose Close
我想编写一个查询来输出这些概率。所以对于上面的例子,输出应该是这样的
0.5 0.7 0.6
0.5 0.7 0.4
0.5 0.3 0.6
0.5 0.3 0.4
0.5 0.7 0.6
0.5 0.7 0.4
0.5 0.3 0.6
0.5 0.3 0.4
对于此示例数据,您可以获得所有可能的组合,其中连接的数量与 table 中不同名称的数量一样多:
WITH cte AS (
SELECT name, Pwin p FROM student
UNION ALL
SELECT name, 1 - Pwin FROM student
)
SELECT c1.p col1, c2.p col2, c3.p col3
FROM cte c1
INNER JOIN cte c2 ON c2.name > c1.name
INNER JOIN cte c3 ON c3.name > c2.name;
参见demo。
当然,对于更多名称,这在性能方面并不能很好地扩展。
假设我有一个 table 看起来像这样:
CREATE TABLE student
(
name CHAR NOT NULL,
Pwin numeric(5,2) NOT NULL
)
INSERT INTO student
VALUES ('A', 0.5),
('B', 0.7),
('C', 0.6)
这代表 3 名学生参加不同的项目。他们每个人都有赢得比赛的概率 (Pwin)。这些事件彼此独立。他们输掉比赛的概率就是= 1 - Pwin.
有 8 种可能的结果
Awin Bwin Cwin
Awin Bwin Close
Awin Blose Cwin
Awin Blose Close
Alose Bwin Cwin
Alose Bwin Close
Alose Blose Cwin
Alose Blose Close
我想编写一个查询来输出这些概率。所以对于上面的例子,输出应该是这样的
0.5 0.7 0.6
0.5 0.7 0.4
0.5 0.3 0.6
0.5 0.3 0.4
0.5 0.7 0.6
0.5 0.7 0.4
0.5 0.3 0.6
0.5 0.3 0.4
对于此示例数据,您可以获得所有可能的组合,其中连接的数量与 table 中不同名称的数量一样多:
WITH cte AS (
SELECT name, Pwin p FROM student
UNION ALL
SELECT name, 1 - Pwin FROM student
)
SELECT c1.p col1, c2.p col2, c3.p col3
FROM cte c1
INNER JOIN cte c2 ON c2.name > c1.name
INNER JOIN cte c3 ON c3.name > c2.name;
参见demo。
当然,对于更多名称,这在性能方面并不能很好地扩展。