diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 013d627..8421798 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -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#" + 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 - r.character1_id AS father_cid, - r.character2_id AS mother_cid, - c1.title_of_nobility, - c1.last_name, - c1.region_id, - fu1.id AS father_uid, - fu2.id AS mother_uid, - ((CURRENT_DATE - c1.birthdate::date) - + (CURRENT_DATE - c2.birthdate::date)) / 2 AS avg_age_days, - 100.0 / - (1 + EXP( - 0.0647 * ( - ((CURRENT_DATE - c1.birthdate::date) - + (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; + character1_id AS father_cid, + character2_id AS mother_cid, + title_of_nobility, + last_name, + region_id, + father_uid, + mother_uid, + mother_age_days, + (1 - POWER(1 - prob_year, 1.0/365.0)) * 100 AS prob_pct + FROM mother_age + WHERE mother_age_days >= 4380 + AND mother_age_days < 18993 + AND random() < (1 - POWER(1 - prob_year, 1.0/365.0)); "#; pub const QUERY_INSERT_CHILD: &str = r#"