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:
@@ -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
|
SELECT
|
||||||
r.character1_id AS father_cid,
|
r.character1_id,
|
||||||
r.character2_id AS mother_cid,
|
r.character2_id,
|
||||||
c1.title_of_nobility,
|
c1.title_of_nobility,
|
||||||
c1.last_name,
|
c1.last_name,
|
||||||
c1.region_id,
|
c1.region_id,
|
||||||
fu1.id AS father_uid,
|
fu1.id AS father_uid,
|
||||||
fu2.id AS mother_uid,
|
fu2.id AS mother_uid,
|
||||||
((CURRENT_DATE - c1.birthdate::date)
|
(CURRENT_DATE - c2.birthdate::date)::int AS mother_age_days,
|
||||||
+ (CURRENT_DATE - c2.birthdate::date)) / 2 AS avg_age_days,
|
CASE
|
||||||
100.0 /
|
WHEN (CURRENT_DATE - c2.birthdate::date) < 4380 THEN 0.005
|
||||||
(1 + EXP(
|
WHEN (CURRENT_DATE - c2.birthdate::date) < 4745 THEN 0.30
|
||||||
0.0647 * (
|
WHEN (CURRENT_DATE - c2.birthdate::date) < 5110 THEN 0.45
|
||||||
((CURRENT_DATE - c1.birthdate::date)
|
WHEN (CURRENT_DATE - c2.birthdate::date) < 5475 THEN 0.55
|
||||||
+ (CURRENT_DATE - c2.birthdate::date)) / 2
|
WHEN (CURRENT_DATE - c2.birthdate::date) < 5840 THEN 0.60
|
||||||
) - 0.0591
|
WHEN (CURRENT_DATE - c2.birthdate::date) < 6205 THEN 0.725
|
||||||
)) AS prob_pct
|
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
|
FROM falukant_data.relationship r
|
||||||
JOIN falukant_type.relationship r2
|
JOIN falukant_type.relationship r2
|
||||||
ON r2.id = r.relationship_type_id
|
ON r2.id = r.relationship_type_id AND r2.tr = 'married'
|
||||||
AND r2.tr = 'married'
|
JOIN falukant_data.character c1 ON c1.id = r.character1_id
|
||||||
JOIN falukant_data.character c1
|
JOIN falukant_data.character c2 ON c2.id = r.character2_id
|
||||||
ON c1.id = r.character1_id
|
LEFT JOIN falukant_data.falukant_user fu1 ON fu1.id = c1.user_id
|
||||||
JOIN falukant_data.character c2
|
LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id
|
||||||
ON c2.id = r.character2_id
|
)
|
||||||
LEFT JOIN falukant_data.falukant_user fu1
|
SELECT
|
||||||
ON fu1.id = c1.user_id
|
character1_id AS father_cid,
|
||||||
LEFT JOIN falukant_data.falukant_user fu2
|
character2_id AS mother_cid,
|
||||||
ON fu2.id = c2.user_id
|
title_of_nobility,
|
||||||
WHERE random() * 100 < (
|
last_name,
|
||||||
100.0 /
|
region_id,
|
||||||
(1 + EXP(
|
father_uid,
|
||||||
0.11166347 * (
|
mother_uid,
|
||||||
((CURRENT_DATE - c1.birthdate::date)
|
mother_age_days,
|
||||||
+ (CURRENT_DATE - c2.birthdate::date)) / 2
|
(1 - POWER(1 - prob_year, 1.0/365.0)) * 100 AS prob_pct
|
||||||
) - 2.638267
|
FROM mother_age
|
||||||
))
|
WHERE mother_age_days >= 4380
|
||||||
) / 2;
|
AND mother_age_days < 18993
|
||||||
|
AND random() < (1 - POWER(1 - prob_year, 1.0/365.0));
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
pub const QUERY_INSERT_CHILD: &str = r#"
|
pub const QUERY_INSERT_CHILD: &str = r#"
|
||||||
|
|||||||
Reference in New Issue
Block a user