我需要一些帮助来解决困扰我两天的问题。
我有这样的“结果”表:
结果_id | competition_id | competitor_id | 竞争对手_排名 |
---|---|---|---|
1 | 1 | 1 | 0.1 |
2 | 1 | 2 | 0.4 |
3 | 1 | 3 | 0.2 |
4 | 1 | 4 | 0.3 |
5 | 2 | 1 | 0.4 |
6 | 2 | 2 | 0.1 |
7 | 2 | 3 | 0.2 |
8 | 2 | 5 | 0.3 |
9 | 3 | 3 | 0.1 |
10 | 3 | 4 | 0.4 |
11 | 3 | 5 | 0.2 |
12 | 3 | 6 | 0.3 |
从“结果”表中,我想获得包含罚分(+1.0)的竞争对手的分组排名,如下所示:
competitor_id | 比赛 | 排名 | 惩罚排名 |
---|---|---|---|
1 | 1; 2;中号 | 0.1; 0.4 | 0.1; 0.4; +1.0 |
2 | 1; 2;中号 | 0.4; 0.1 | 0.4; 0.1; +1.0 |
3 | 1; 2; 3 | 0.2; 0.2; 0.1 | 0.2; 0.2; 0.1 |
4 | 1;中号; 3 | 0.3; 0.4 | 0.3; +1.0; 0.4 |
5 | M; 2; 3 | 0.3; 0.2 | +1.0; 0.3; 0.2 |
6 | 3;中号;中号; | 0.3 | 0.3; +1.0; +1.0 |
我知道 group_concat 函数是一个聚合函数,用于连接列中的所有非空值。我知道这项任务相当微不足道。但我无法解决。
CREATE TABLE results (
result_id INTEGER PRIMARY KEY,
competition_id INTEGER,
competitor_id INTEGER,
competitor_ranking
);
INSERT INTO results(competition_id, competitor_id, competitor_ranking) VALUES
(1, 1, 0.1), (1, 2, 0.4), (1, 3, 0.2), (1, 4, 0.3),
(2, 1, 0.4), (2, 2, 0.1), (2, 3, 0.2), (2, 5, 0.3),
(3, 3, 0.1), (3, 4, 0.4), (3, 5, 0.2), (3, 6, 0.3)
;
SELECT
competitor_id,
group_concat(coalesce(competition_id, NULL), '; ') AS competitions,
group_concat(coalesce(competitor_ranking, NULL), '; ') AS rankings,
group_concat(coalesce(NULLIF(competitor_ranking, NULL), '+1.0'), '; ') AS ranking_with_penalties
FROM results
GROUP BY competitor_id;
我期待任何帮助。
我相信以下会产生你想要的结果
使用 :-
实现WITH
cte_comp_competitor_matrix AS (
SELECT DISTINCT results.competition_id,c2.competitor_id FROM results JOIN results AS c2 ON 1
),
cte_stage2 AS (
SELECT competitor_id,competition_id,
CASE cccm.competitor_id IN(SELECT competitor_id FROM results WHERE competition_id = cccm.competition_id)
WHEN 1 THEN competition_id ELSE 'M' END
AS matched
FROM cte_comp_competitor_matrix AS cccm ORDER BY competitor_id
),
cte_stage3 AS (
SELECT *,
coalesce(
(
SELECT competitor_ranking
FROM results
WHERE cte_stage2.competitor_id = results.competitor_id
AND cte_stage2.competition_id = results.competition_id
),
'+1.0'
) AS competitor_ranking
FROM cte_stage2
)
SELECT
competitor_id,
group_concat(matched) AS competitions,
group_concat(competitor_ranking) AS rankings
FROM cte_stage3
GROUP BY competitor_id
;