Okay, I’ve got a mostly-working solution. The only thing this doesn’t address is the change between patients, and how that throws off the weight change calculation. I also deviated from the setup laid out by @W_Vann_Hall a little bit.

First, add a field to your `[Records]`

table named `{Weight Padded}`

, using the following formula:

```
REPT(" ", 5-LEN(Weight & "")) & Weight
```

This prepends a bunch of spaces in front of each weight value, such that the length of the resulting string is always exactly five characters. I chose 5 because I didn’t think you’d need more than that many characters for a given weight: ###.# . However, if you need more, just increase the number, but note it because you’ll need it later on.

In the `[Calc]`

table, modify the `{Weights}`

rollup to pull from `{Weight Padded`

}, using only `"values"`

as the aggregation function.

Back in `[Records]`

, use this for the `{Previous Weight}`

rollup aggregation function:

```
IF(
AND(
Date,
Weight
), VALUE(
MID(
ARRAYJOIN(values,""),
(({Patient_Record} - 2) * 5) + 1,
5
)
)
)
```

NOTE: if you changed the value from 5 to some other number in the `{Weight Padded}`

formula, replace each “5” in this one with the new number.

Rather than trying to find specific text, this simply uses the `{Patient_Record}`

value to calculate how far into the array-joined mega-string to grab a five-character chunk. That chunk is then turned into a numerical value.

Finally, change the `{Change in Weight}`

formula to this:

```
IF({Previous Weight}, Weight-{Previous Weight})
```

And the result looks like this (with most helper fields hidden):

If you want to only show a weight change when there’s one to show, you could use this, which would hide all of the distracting 0.0 entries.

```
IF(AND({Previous Weight}, Weight-{Previous Weight}), Weight-{Previous Weight})
```