By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE tablename (`ID` INTEGER, `Group` VARCHAR(1), `value` FLOAT, `weight` INTEGER);
INSERT INTO tablename (`ID`, `Group`, `value`, `weight`) VALUES
('1', 'A', '2.0', '1'),
('2', 'A', '1.5', '2'),
('3', 'A', '50.0', '1'),
('4', 'A', '1', '3'),
('5', 'A', '100', '2'),
('6', 'B', '25', '1'),
('7', 'B', '2', '2'),
('8', 'B', '1', '1'),
('9', 'B', '10', '1');
SELECT `Group`, SUM(value * weight) / SUM(weight) avg_value
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY `Group` ORDER BY value DESC) rn
FROM tablename
) t
WHERE rn > 2
GROUP BY `Group`
Group | avg_value |
---|---|
A | 1.3333333333333333 |
B | 1.6666666666666667 |
SELECT `Group`, SUM(value * weight) / SUM(weight) avg_value
FROM (
SELECT *, RANK() OVER (PARTITION BY `Group` ORDER BY value DESC) rn
FROM tablename
) t
WHERE rn > 2
GROUP BY `Group`
Group | avg_value |
---|---|
A | 1.3333333333333333 |
B | 1.6666666666666667 |
SELECT `Group`, SUM(value * weight) / SUM(weight) avg_value
FROM (
SELECT *, DENSE_RANK() OVER (PARTITION BY `Group` ORDER BY value DESC) rn
FROM tablename
) t
WHERE rn > 2
GROUP BY `Group`
Group | avg_value |
---|---|
A | 1.3333333333333333 |
B | 1.6666666666666667 |