Enhance pregnancy candidate query: Refactored SQL query to calculate pregnancy probabilities based on mother's age, utilizing a common table expression (CTE) for improved clarity and maintainability. The new logic replaces the previous average age calculation with a more detailed age-based probability assessment, ensuring accurate filtering of candidates.

This commit is contained in:
Torsten Schulz (local)
2026-03-19 09:13:36 +01:00
parent 6757aa363f
commit f9c80bbd6b

View File

@@ -1217,45 +1217,74 @@ pub const QUERY_AUTOBATISM: &str = r#"
); );
"#; "#;
// Biologische Fruchtbarkeit nach Alter der Frau (Jahres-Wahrscheinlichkeit).
// Umrechnung auf Tages-Wahrscheinlichkeit: P_tag = 1 - (1 - P_jahr)^(1/365)
// Grenzen in Tagen: 1 Jahr ≈ 365 Tage
pub const QUERY_GET_PREGNANCY_CANDIDATES: &str = r#" pub const QUERY_GET_PREGNANCY_CANDIDATES: &str = r#"
WITH mother_age AS (
SELECT
r.character1_id,
r.character2_id,
c1.title_of_nobility,
c1.last_name,
c1.region_id,
fu1.id AS father_uid,
fu2.id AS mother_uid,
(CURRENT_DATE - c2.birthdate::date)::int AS mother_age_days,
CASE
WHEN (CURRENT_DATE - c2.birthdate::date) < 4380 THEN 0.005
WHEN (CURRENT_DATE - c2.birthdate::date) < 4745 THEN 0.30
WHEN (CURRENT_DATE - c2.birthdate::date) < 5110 THEN 0.45
WHEN (CURRENT_DATE - c2.birthdate::date) < 5475 THEN 0.55
WHEN (CURRENT_DATE - c2.birthdate::date) < 5840 THEN 0.60
WHEN (CURRENT_DATE - c2.birthdate::date) < 6205 THEN 0.725
WHEN (CURRENT_DATE - c2.birthdate::date) < 6570 THEN 0.80
WHEN (CURRENT_DATE - c2.birthdate::date) < 7305 THEN 0.855
WHEN (CURRENT_DATE - c2.birthdate::date) < 9125 THEN 0.875
WHEN (CURRENT_DATE - c2.birthdate::date) < 10950 THEN 0.84
WHEN (CURRENT_DATE - c2.birthdate::date) < 11315 THEN 0.785
WHEN (CURRENT_DATE - c2.birthdate::date) < 11680 THEN 0.765
WHEN (CURRENT_DATE - c2.birthdate::date) < 12045 THEN 0.74
WHEN (CURRENT_DATE - c2.birthdate::date) < 12410 THEN 0.72
WHEN (CURRENT_DATE - c2.birthdate::date) < 12775 THEN 0.695
WHEN (CURRENT_DATE - c2.birthdate::date) < 13140 THEN 0.65
WHEN (CURRENT_DATE - c2.birthdate::date) < 13505 THEN 0.63
WHEN (CURRENT_DATE - c2.birthdate::date) < 13870 THEN 0.60
WHEN (CURRENT_DATE - c2.birthdate::date) < 14235 THEN 0.55
WHEN (CURRENT_DATE - c2.birthdate::date) < 14600 THEN 0.50
WHEN (CURRENT_DATE - c2.birthdate::date) < 14965 THEN 0.45
WHEN (CURRENT_DATE - c2.birthdate::date) < 15330 THEN 0.35
WHEN (CURRENT_DATE - c2.birthdate::date) < 15695 THEN 0.25
WHEN (CURRENT_DATE - c2.birthdate::date) < 16060 THEN 0.15
WHEN (CURRENT_DATE - c2.birthdate::date) < 16425 THEN 0.075
WHEN (CURRENT_DATE - c2.birthdate::date) < 16790 THEN 0.03
WHEN (CURRENT_DATE - c2.birthdate::date) < 17155 THEN 0.02
WHEN (CURRENT_DATE - c2.birthdate::date) < 17520 THEN 0.015
WHEN (CURRENT_DATE - c2.birthdate::date) < 18250 THEN 0.005
ELSE 0.001
END AS prob_year
FROM falukant_data.relationship r
JOIN falukant_type.relationship r2
ON r2.id = r.relationship_type_id AND r2.tr = 'married'
JOIN falukant_data.character c1 ON c1.id = r.character1_id
JOIN falukant_data.character c2 ON c2.id = r.character2_id
LEFT JOIN falukant_data.falukant_user fu1 ON fu1.id = c1.user_id
LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id
)
SELECT SELECT
r.character1_id AS father_cid, character1_id AS father_cid,
r.character2_id AS mother_cid, character2_id AS mother_cid,
c1.title_of_nobility, title_of_nobility,
c1.last_name, last_name,
c1.region_id, region_id,
fu1.id AS father_uid, father_uid,
fu2.id AS mother_uid, mother_uid,
((CURRENT_DATE - c1.birthdate::date) mother_age_days,
+ (CURRENT_DATE - c2.birthdate::date)) / 2 AS avg_age_days, (1 - POWER(1 - prob_year, 1.0/365.0)) * 100 AS prob_pct
100.0 / FROM mother_age
(1 + EXP( WHERE mother_age_days >= 4380
0.0647 * ( AND mother_age_days < 18993
((CURRENT_DATE - c1.birthdate::date) AND random() < (1 - POWER(1 - prob_year, 1.0/365.0));
+ (CURRENT_DATE - c2.birthdate::date)) / 2
) - 0.0591
)) AS prob_pct
FROM falukant_data.relationship r
JOIN falukant_type.relationship r2
ON r2.id = r.relationship_type_id
AND r2.tr = 'married'
JOIN falukant_data.character c1
ON c1.id = r.character1_id
JOIN falukant_data.character c2
ON c2.id = r.character2_id
LEFT JOIN falukant_data.falukant_user fu1
ON fu1.id = c1.user_id
LEFT JOIN falukant_data.falukant_user fu2
ON fu2.id = c2.user_id
WHERE random() * 100 < (
100.0 /
(1 + EXP(
0.11166347 * (
((CURRENT_DATE - c1.birthdate::date)
+ (CURRENT_DATE - c2.birthdate::date)) / 2
) - 2.638267
))
) / 2;
"#; "#;
pub const QUERY_INSERT_CHILD: &str = r#" pub const QUERY_INSERT_CHILD: &str = r#"