I suspected it.
There is probably no easier way?
Here is my first solution with sql queries. It takes stats from an entity. All of theres have an inner join to consider the last state of previous day/week/month/quarter/year.
- platform: sql
db_url: mysql://user:pass@core-mariadb/homeassistant?charset=utf8
queries:
- name: Wasserverbrauch in L (heute)
query: 'select IFNULL(ROUND(max(states.state) - max(max_last_day.state), 2), 0) AS state from states INNER JOIN (select IFNULL(ROUND(max(state), 2), 0) AS state from states where state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND DATE(last_updated) = CURDATE() - 1) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND DATE(states.last_updated) = CURDATE();'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (gestern)
query: 'SELECT Ifnull(Round(Max(states.state) - IF(max(max_last_day.state) > 0, max(max_last_day.state), min(states.state)), 2), 0) AS state FROM states INNER JOIN ( SELECT Ifnull(Round(Max(state), 2), 0) AS state FROM states WHERE state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND Date(last_updated) = Curdate() - 2) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND Date(states.last_updated) = Curdate() - 1;'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (diese Woche)
query: 'select IFNULL(ROUND(max(states.state) - IF(max(max_last_day.state) > 0, max(max_last_day.state), min(states.state)), 2), 0) AS state from states INNER JOIN (select IFNULL(ROUND(max(state), 2), 0) AS state from states where state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND YEARWEEK(last_updated, 1) = YEARWEEK(CURRENT_DATE - INTERVAL 1 WEEK, 1)) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND YEARWEEK(states.last_updated, 1) = YEARWEEK(CURRENT_DATE, 1);'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (letzte Woche)
query: 'SELECT Ifnull(Round(Max(states.state) - IF(Max(max_last_day.state) > 0, Max(max_last_day.state), Min(states.state)), 2), 0) AS state FROM states INNER JOIN ( SELECT Ifnull(Round(Max(state), 2), 0) AS state FROM states WHERE state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND Yearweek(last_updated, 1) = Yearweek(CURRENT_DATE - INTERVAL 2 week, 1)) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND Yearweek(states.last_updated, 1) = Yearweek(CURRENT_DATE - INTERVAL 1 week, 1);'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (dieser Monat)
query: 'select IFNULL(ROUND(max(states.state) - IF(max(max_last_day.state) > 0, max(max_last_day.state), min(states.state)), 2), 0) AS state from states INNER JOIN (select IFNULL(ROUND(max(state), 2), 0) AS state from states where state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND MONTH(last_updated) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) and YEAR(last_updated) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND MONTH(states.last_updated) = MONTH(CURRENT_TIMESTAMP) and YEAR(states.last_updated) = YEAR(CURRENT_TIMESTAMP);'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (letzter Monat)
query: 'SELECT Ifnull(Round(Max(states.state) - IF(Max(max_last_day.state) > 0, Max(max_last_day.state), Min(states.state)), 2), 0) AS state FROM states INNER JOIN ( SELECT Ifnull(Round(Max(state), 2), 0) AS state FROM states WHERE state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND Month(last_updated) = Month(CURRENT_DATE - INTERVAL 2 month) AND Year(last_updated) = Year(CURRENT_DATE - INTERVAL 2 month)) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND Month(states.last_updated) = Month(CURRENT_DATE - INTERVAL 1 month) AND Year(states.last_updated) = Year(CURRENT_DATE - INTERVAL 1 month);'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (dieses Quartal)
query: 'select IFNULL(ROUND(max(states.state) - IF(max(max_last_day.state) > 0, max(max_last_day.state), min(states.state)), 2), 0) AS state from states INNER JOIN (select IFNULL(ROUND(max(state), 2), 0) AS state from states where state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND QUARTER(last_updated) = QUARTER(CURRENT_DATE - INTERVAL 1 QUARTER) and YEAR(last_updated) = YEAR(CURRENT_DATE - INTERVAL 1 QUARTER)) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND QUARTER(states.last_updated) = QUARTER(CURRENT_TIMESTAMP) and YEAR(states.last_updated) = YEAR(CURRENT_TIMESTAMP);'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (letztes Quartal)
query: 'SELECT Ifnull(Round(Max(states.state) - IF(Max(max_last_day.state) > 0, Max(max_last_day.state), Min(states.state)), 2), 0) AS state FROM states INNER JOIN ( SELECT Ifnull(Round(Max(state), 2), 0) AS state FROM states WHERE state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND Quarter(last_updated) = Quarter(CURRENT_DATE - INTERVAL 2 quarter) AND Year(last_updated) = Year(CURRENT_DATE - INTERVAL 2 quarter)) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND Quarter(states.last_updated) = Quarter(CURRENT_DATE - INTERVAL 1 quarter) AND Year(states.last_updated) = Year(CURRENT_DATE - INTERVAL 1 quarter);'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (dieses Jahr)
query: 'select IFNULL(ROUND(max(states.state) - IF(max(max_last_day.state) > 0, max(max_last_day.state), min(states.state)), 2), 0) AS state from states INNER JOIN (select IFNULL(ROUND(max(state), 2), 0) AS state from states where state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND YEAR(last_updated) = YEAR(CURRENT_TIMESTAMP) - 1) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND YEAR(states.last_updated) = YEAR(CURRENT_TIMESTAMP);'
column: "state"
unit_of_measurement: L
- name: Wasserverbrauch in L (letztes Jahr)
query: 'select IFNULL(ROUND(max(states.state) - IF(max(max_last_day.state) > 0, max(max_last_day.state), min(states.state)), 2), 0) AS state from states INNER JOIN (select IFNULL(ROUND(max(state), 2), 0) AS state from states where state > 0 AND entity_id LIKE "sensor.wasserverbrauch_l" AND YEAR(last_updated) = YEAR(CURRENT_TIMESTAMP) - 2) AS max_last_day where states.state > 0 AND states.entity_id LIKE "sensor.wasserverbrauch_l" AND YEAR(states.last_updated) = YEAR(CURRENT_TIMESTAMP) - 1;'
column: "state"
unit_of_measurement: L