Utility_meter, statistics and database

I have a configuration that tracks total rainfall, and then uses the statistics integration in a template to present rainfall in the last 3 days and last 2 weeks.

The config looks like:

recorder:
  include:
    entities:
      - sensor.rain_total
      - sensor.recent_rain
      - sensor.long_term_rain

utility_meter:
  rain_total:
    source: sensor.sydney_olympic_park_rain_since_9am
    name: Rain total

sensor:
  - platform: statistics
    name: Recent rain
    entity_id: sensor.rain_total
    state_characteristic: change
    sampling_size: 300
    precision: 1
    max_age:
      days: 3
  - platform: statistics
    name: Long term rain
    entity_id: sensor.rain_total
    state_characteristic: change
    sampling_size: 600
    precision: 1
    max_age:
      days: 14

The problem I have is that the sensor for rainfall in the last 3 days is showing ‘Unknown’.
I am presuming because I am using state_characteristic ‘change’ on the sensor, and the source sensor in the utility_meter integration hasn’t changed in 3 days. But this is the part I don’t understand - if I look at the database using sqlite3, the statistics table has valid samples (both hourly and 5 minutes) up to the purge time, so I can only conclude that the statistics integration doesn’t actually use the database to work out the ‘change’ value (which should be the newest - oldest in the range specified).
So how does the statistics integration actually work? Does it ignore the database values, and instead keep some internal track of changes? My expectation is that it should use the database samples, since these samples are the actual stored values from the sensor. I guess I can dive into the code and look at what it is actually doing, but I’d like to understand what the intent is here, so I can understand what the statistics integration is actually meant to do first.

Given that the statistics attributes include ‘sampling_size’, I presume that internally the database is ignored and is entirely event driven rather than sampling driven, so if there are no source changes, nothing is saved. This seems wrong, that any update regardless of whether it is an actual different value should be sampled.
Of course, the issue may be in the utility_meter integration (or even in the BOM integration) where if there is no change, it doesn’t ‘update’ the sensor.