使用 Group by 获取表格的百分比
Get Percentages of Tables with Group by
我正在为当地联赛制作预测游戏。
一场比赛由其 SPIELTAG(比赛日)及其 MATCH_NR 定义。
一个预测有一个匹配和一个结果 (ERGA, ERGB)
我有一个像这样的Table fiddle https://www.db-fiddle.com/f/o4NXPFfzod39LpMaTzqz3r/0
我得到了计算每个比赛日和每场比赛的每个结果的输出。
| SPIELTAG | MATCH_NR | ERGA | ERGB | AMOUNT |
| -------- | -------- | ---- | ---- | ------ |
| 4 | 1 | 7 | 1 | 1 |
| 4 | 1 | 7 | 2 | 2 |
| 4 | 1 | 7 | 3 | 5 |
| 4 | 1 | 7 | 4 | 1 |
| 4 | 2 | 1 | 7 | 1 |
| 4 | 2 | 2 | 7 | 6 |
| 4 | 2 | 3 | 7 | 3 |
我想要实现的是,在数量栏旁边有类似
的内容
| SPIELTAG | MATCH_NR | ERGA | ERGB | AMOUNT | PERC |
| -------- | -------- | ---- | ---- | ------ | ---- |
| 4 | 1 | 7 | 1 | 1 | 11.1%| => 1 / 9
| 4 | 1 | 7 | 2 | 2 | 22.2%| => 2 / 9
| 4 | 1 | 7 | 3 | 5 | 55.5%| => 5 / 9
| 4 | 1 | 7 | 4 | 1 | 11.1%| => 1 / 9
| 4 | 2 | 1 | 7 | 1 | 11.1%| => 1 / 9
| 4 | 2 | 2 | 7 | 5 | 55.5%| => 5 / 9
| 4 | 2 | 3 | 7 | 3 | 33.3%| => 3 / 9
其中 PERC 是每个比赛日 SPIELTAG 的选秀权百分比。基本上,结果(ERGA,ERGB)的元组为每个匹配 SPIELTAG 预测的频率是多少,MATCH_NR。
我找到了一个 post 在那里我可以得到所有选秀权的百分比但在比赛日不受限制,匹配元组。
一个例子:
第 1 场比赛(Spieltag 4,第 1 场比赛)有 9 个预测。
1x: 7-1
2x: 7-2
5x: 7-3
1x: 7-4
__
9x -> ALL_COUNTS_PER_MATCH
因此 PERC 应该类似于 'AMOUNT' / ALL_COUNTS_PER_MATCH。
我认为你需要另一个群组:
SELECT `t`.`SPIELTAG` AS `SPIELTAG`,
`t`.`MATCH_NR` AS `MATCH_NR`,
`t`.`TEAM_A` AS `ERGA`,
`t`.`TEAM_B` AS `ERGB`,
count(0) AS `AMOUNT`,
COUNT(0) / MAX(A.TOTAL_AMOUNT) -- MIN would also work
FROM `TIPPSPIEL_TIPP` `t`
JOIN (
-- Calculate the row count by each different spieltag & match_nr combination
SELECT `t`.`SPIELTAG`,
`t`.`MATCH_NR`,
count(0) AS `TOTAL_AMOUNT`
FROM `TIPPSPIEL_TIPP` `t`
GROUP BY `t`.`SPIELTAG`, `t`.`MATCH_NR`
) A USING (SPIELTAG, MATCH_NR)
GROUP BY `t`.`SPIELTAG`, `t`.`MATCH_NR`, `t`.`TEAM_A`, `t`.`TEAM_B`
;
检查这个,但会在 Mysql 8 中工作,而不是较低的版本
https://www.db-fiddle.com/f/o4NXPFfzod39LpMaTzqz3r/4
SELECT DISTINCT `t`.`SPIELTAG` AS `SPIELTAG`,
`t`.`MATCH_NR` AS `MATCH_NR`,
`t`.`TEAM_A` AS `ERGA`,
`t`.`TEAM_B` AS `ERGB`,
COUNT(0) OVER (PARTITION BY `t`.`SPIELTAG`,
`t`.`MATCH_NR`,
`t`.`TEAM_A`,
`t`.`TEAM_B`) AS AMOUNT,
COUNT(0) OVER (PARTITION BY `t`.`SPIELTAG`,
`t`.`MATCH_NR`,
`t`.`TEAM_A`,
`t`.`TEAM_B`) / COUNT(CONCAT(SPIELTAG, MATCH_NR)) OVER (PARTITION BY `t`.`SPIELTAG`,
`t`.`MATCH_NR`) AS match_count
FROM `TIPPSPIEL_TIPP` `t`
我正在为当地联赛制作预测游戏。
一场比赛由其 SPIELTAG(比赛日)及其 MATCH_NR 定义。 一个预测有一个匹配和一个结果 (ERGA, ERGB)
我有一个像这样的Table fiddle https://www.db-fiddle.com/f/o4NXPFfzod39LpMaTzqz3r/0
我得到了计算每个比赛日和每场比赛的每个结果的输出。
| SPIELTAG | MATCH_NR | ERGA | ERGB | AMOUNT |
| -------- | -------- | ---- | ---- | ------ |
| 4 | 1 | 7 | 1 | 1 |
| 4 | 1 | 7 | 2 | 2 |
| 4 | 1 | 7 | 3 | 5 |
| 4 | 1 | 7 | 4 | 1 |
| 4 | 2 | 1 | 7 | 1 |
| 4 | 2 | 2 | 7 | 6 |
| 4 | 2 | 3 | 7 | 3 |
我想要实现的是,在数量栏旁边有类似
的内容| SPIELTAG | MATCH_NR | ERGA | ERGB | AMOUNT | PERC |
| -------- | -------- | ---- | ---- | ------ | ---- |
| 4 | 1 | 7 | 1 | 1 | 11.1%| => 1 / 9
| 4 | 1 | 7 | 2 | 2 | 22.2%| => 2 / 9
| 4 | 1 | 7 | 3 | 5 | 55.5%| => 5 / 9
| 4 | 1 | 7 | 4 | 1 | 11.1%| => 1 / 9
| 4 | 2 | 1 | 7 | 1 | 11.1%| => 1 / 9
| 4 | 2 | 2 | 7 | 5 | 55.5%| => 5 / 9
| 4 | 2 | 3 | 7 | 3 | 33.3%| => 3 / 9
其中 PERC 是每个比赛日 SPIELTAG 的选秀权百分比。基本上,结果(ERGA,ERGB)的元组为每个匹配 SPIELTAG 预测的频率是多少,MATCH_NR。
我找到了一个 post 在那里我可以得到所有选秀权的百分比但在比赛日不受限制,匹配元组。
一个例子:
第 1 场比赛(Spieltag 4,第 1 场比赛)有 9 个预测。
1x: 7-1
2x: 7-2
5x: 7-3
1x: 7-4
__
9x -> ALL_COUNTS_PER_MATCH
因此 PERC 应该类似于 'AMOUNT' / ALL_COUNTS_PER_MATCH。
我认为你需要另一个群组:
SELECT `t`.`SPIELTAG` AS `SPIELTAG`,
`t`.`MATCH_NR` AS `MATCH_NR`,
`t`.`TEAM_A` AS `ERGA`,
`t`.`TEAM_B` AS `ERGB`,
count(0) AS `AMOUNT`,
COUNT(0) / MAX(A.TOTAL_AMOUNT) -- MIN would also work
FROM `TIPPSPIEL_TIPP` `t`
JOIN (
-- Calculate the row count by each different spieltag & match_nr combination
SELECT `t`.`SPIELTAG`,
`t`.`MATCH_NR`,
count(0) AS `TOTAL_AMOUNT`
FROM `TIPPSPIEL_TIPP` `t`
GROUP BY `t`.`SPIELTAG`, `t`.`MATCH_NR`
) A USING (SPIELTAG, MATCH_NR)
GROUP BY `t`.`SPIELTAG`, `t`.`MATCH_NR`, `t`.`TEAM_A`, `t`.`TEAM_B`
;
检查这个,但会在 Mysql 8 中工作,而不是较低的版本
https://www.db-fiddle.com/f/o4NXPFfzod39LpMaTzqz3r/4
SELECT DISTINCT `t`.`SPIELTAG` AS `SPIELTAG`,
`t`.`MATCH_NR` AS `MATCH_NR`,
`t`.`TEAM_A` AS `ERGA`,
`t`.`TEAM_B` AS `ERGB`,
COUNT(0) OVER (PARTITION BY `t`.`SPIELTAG`,
`t`.`MATCH_NR`,
`t`.`TEAM_A`,
`t`.`TEAM_B`) AS AMOUNT,
COUNT(0) OVER (PARTITION BY `t`.`SPIELTAG`,
`t`.`MATCH_NR`,
`t`.`TEAM_A`,
`t`.`TEAM_B`) / COUNT(CONCAT(SPIELTAG, MATCH_NR)) OVER (PARTITION BY `t`.`SPIELTAG`,
`t`.`MATCH_NR`) AS match_count
FROM `TIPPSPIEL_TIPP` `t`