In the table below, I'd like to minus the previous rows date from the current rows date as long as the MPAN columns match, also if the result was to be over 365 I'd like it to max as 365.
We're using MySQL and PHP to try and calculate these and we could do with some guidance on how to achieve it.
Source
MPAN | Current_Supplier | EAC | EAC_EFD | Days Applicable | Value |
---|---|---|---|---|---|
ID1 | TGPL | 96.7 | 22/05/2021 | 0 | 0.26 |
ID1 | TGPL | 28009.9 | 26/11/2021 | 0 | 148.74 |
ID1 | TGPL | 30771.2 | 23/05/2022 | 0 | 16.61 |
ID2 | TGPL | 191.9 | 22/05/2021 | 0 | 0.53 |
ID2 | TGPL | 217.9 | 26/08/2021 | 0 | 0.8 |
ID2 | TGPL | 118.1 | 26/11/2021 | 0 | -0.56 |
ID2 | TGPL | 38 | 25/02/2022 | 0 | -0.35 |
ID2 | TGPL | 18.2 | 23/05/2023 | 0 | 0.3 |
Desired result
MPAN | Current_Supplier | EAC | EAC_EFD | Days Applicable | Value |
---|---|---|---|---|---|
ID1 | TGPL | 96.7 | 22/05/2021 | 365 | 0.26 |
ID1 | TGPL | 28009.9 | 26/11/2021 | 188 | 148.74 |
ID1 | TGPL | 30771.2 | 23/05/2022 | 178 | 16.61 |
ID2 | TGPL | 191.9 | 22/05/2021 | 365 | 0.53 |
ID2 | TGPL | 217.9 | 26/08/2021 | 96 | 0.8 |
ID2 | TGPL | 118.1 | 26/11/2021 | 92 | -0.56 |
ID2 | TGPL | 38 | 25/02/2022 | 91 | -0.35 |
ID2 | TGPL | 18.2 | 23/05/2023 | 365 | 0.3 |
Thanks.
CodePudding user response:
When you use MySQL 8 then you can use window function LAG
returned value from previous row:
select
id, d,
LEAST(
COALESCE(
DATEDIFF(d, lag(d) over (partition by id order by d)), 365
),
365)
from tbl;
For prevent numbers greater then 365 use LEAST
function and COALESCE
for prevent NULL values