簡體   English   中英

在postgres中按范圍內的多列分組

[英]Grouping by multiple columns in a range in postgres

我有幾個表(pega.race 也存在我們只是不需要任何數據)


CREATE TABLE pega.pega_race (
    id bigserial NOT NULL,
    race_id int8 NOT NULL,
    pega_id int8 NOT NULL,
    "result" int4 NOT NULL,
    ts timestamp NULL DEFAULT now_utc(),
    CONSTRAINT pega_race_pk PRIMARY KEY (id)
)

CREATE TABLE pega.pega (
    id int8 NOT NULL,
    speed numeric NULL,
    strength numeric NULL,
    lightning numeric NULL,
    wind numeric NULL,
    water numeric NULL,
    fire numeric NULL,
    CONSTRAINT pega_pk PRIMARY KEY (id)
);

我想要的是獲得一個范圍內速度/力量/風/閃電/水/火的每個組合(排列?)的平均結果。 所以從 0-2.25、2.25-4.5、4.5-6.75 和 6.75-9。 它們必須在 0-9 之內。 除此之外不存在任何價值。

所以我想要 6.75-9 速度、2.25-4.5 強度、4.5-6.75 風、2.25-4.5 閃電、0-2.25 水、0-2.25 火和所有其他組合的平均結果。 我沒有足夠的數據來簡單地四舍五入

SELECT round(speed) speed, round(pega.strength) strength, round(pega.lightning) lightning, round(pega.wind) wind, round(pega.water) water, round(pega.fire) fire, 
    avg(result), 
    count(*) 
FROM pega.pega
JOIN pega.pega_race pr ON pega.id=pr.pega_id
GROUP BY 1, 2, 3, 4, 5, 6
HAVING count(*) > 20
ORDER BY avg(result)

所以我想擴大這些范圍,將可能性的數量減少幾個因素。

查看與此類似的其他帖子,我找到了在單個列上按范圍分組的解決方案,並且我正在努力將其擴展到多個列。

這是我所做的嘗試

with series as (
    SELECT generate_series(0, 9-2.25, 2.25) as r_from
), range as (
    SELECT r_from, r_from + 2.25 as r_to FROM series
), pega_data as (
    SELECT speed, strength, lightning, wind, water, pega.fire, result
    FROM pega.pega
    JOIN pega.pega_race pr ON pega.id=pr.pega_id
    JOIN pega.race ON pr.race_id=race.id
)
SELECT r_from, r_to, 
    (SELECT count(*) speed_count FROM pega_data WHERE speed between r_from and r_to),
    (SELECT count(*) strength_count FROM pega_data WHERE strength between r_from and r_to),
    (SELECT count(*) lightning_count FROM pega_data WHERE lightning between r_from and r_to),
    (SELECT count(*) wind_count FROM pega_data WHERE wind between r_from and r_to),
    (SELECT count(*) water_count FROM pega_data WHERE water between r_from and r_to),
    (SELECT count(*) fire_count FROM pega_data WHERE fire between r_from and r_to),
    (SELECT AVG(result) FROM pega_data  WHERE speed between r_from and r_to AND strength between r_from and r_to AND lightning between r_from and r_to AND wind between r_from and r_to AND water between r_from and r_to AND fire between r_from and r_to)
FROM range

我想我快到了? 但不確定如何將所有內容分解為每個組合。

謝謝。

另外,如果你能引導我走上獲得第一名的道路,獎勵積分。 (結果 == 1)。 如果你能引導我走上一條更具統計性的路線,找出眾多列與較低結果/較高 1st % 之間的相關性,則額外加分。 這個我什至不知道如何開始..最后(也是唯一的)統計數據 class 是 5 年前的現在..

由於常規數據結構,您無需顯式生成系列並檢查范圍。 嘗試使用算術運算通過范圍索引 0..3 獲取統計信息。 例如

select floor(speed/2.25)::int r_speed, floor(strength/2.25)::int r_strength, floor(lightning/2.25)::int r_lightning, floor(wind/2.25)::int r_wind, count(*) n
from pega_data
group by r_speed, r_strength, r_lightning, r_wind
order by r_speed, r_strength, r_lightning, r_wind

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM