php - Calculate difference between two avg based on same value from different columns
I have a table with football odds that looks like below:
fixture_id | H_odds | D_odds | A_odds | ev_tstamp | updated |
---|---|---|---|---|---|
120000 | 1.40 | 1.50 | 1.60 | 132000 | 12 |
120000 | 1.20 | 1.20 | 1.20 | 132000 | 11 |
120000 | 1.20 | 1.20 | 1.20 | 132000 | 10 |
120000 | 1.10 | 1.20 | 1.20 | 132000 | 9 |
180000 | 1.20 | 1.30 | 1.60 | 132000 | 12 |
180000 | 1.10 | 1.20 | 1.20 | 132000 | 11 |
180000 | 1.50 | 1.80 | 1.50 | 132000 | 10 |
Answer
Solution:
You can do this by joining the table on itself:
select
t_max.*,
(t_max.H_odds - t_min.H_odds) as dif_h,
(t_max.D_odds - t_min.D_odds) as dif_d,
(t_max.A_odds - t_min.A_odds) as dif_a
from
(
select
fixture_id,
min(updated) min_updated,
max(updated) max_updated
from
test
group by
fixture_id
) as t1
join test as t_min on (t_min.fixture_id = t1.fixture_id and t_min.updated = t1.min_updated)
join test as t_max on (t_max.fixture_id = t1.fixture_id and t_max.updated = t1.max_updated)
Working example.
In MySQL >= 8 there may be a solution using window-functions, but im not too sure about that since the fields you need can not be fetched by an aggregate function itself, they are just identified by an aggregate (namely min
and max
) + fixture_id.
You'd need something like this:
SELECT
MIN(updated) over (partition by fixture_id)
...
This get max updated for all grouped 'fixture_id' (but you dont want 'min(updated)', you want 'H_odds' etc. of the row having 'min(updated) AND fixture_id = "fixture_id of max(updated) with same fixture_id') - which, please correct me if im wrong, does not exist. But since you dont use MySql >= 8 anyways this is not an option.
And please get unique ids :)
Important
You need to index your table:
// recommended if you plan to narrow down your results by this fields - which i assume
create index t_f on test (fixture_id);
create index t_u on test (updated);
// MUST HAVE
create unique index t_fu on test (fixture_id, updated);
If you dont do so, there will be temptables on your filesystem - (very very slow)
Working example.
Update: A rather unpleasant MySQL >= 8 window-function version (using filesort - DO NOT USE).
Source