是否有 better/faster 方法来计算日期之间的平均增量?

Is there a better/faster way to compute an average delta between dates?

这是一部病历作品。目标是计算每位患者每年 care-unit 两次医疗咨询之间的平均值(以天为单位)。我被大记录困住了:对于少于 50 名患者/200 次咨询的小单位,下面的 HQL 查询(一年 care-unit/one 年)是可用的并且 相对 快,但对于更大的医疗 activity,有一个“组合爆炸”,数据库负载很重......我的愿望是分析 10 年的一些 80 care-units... 一次发射。 如果您有任何建议,我将不胜感激!

SELECT
HB3 patient.pati_nip AS NIPP,
UPPER(cufm.cufm_libelle) AS CAT_UFM,
grp.unfo_libelle AS SECTEUR_DISP,
uf_ex.codeLibelle AS UNITE,
COUNT(DISTINCT raa.id) AS RAA,
COUNT(DISTINCT patient.id) AS PATIENTS,
ROUND(AVG(raa2.traa_date-raa.traa_date),1) AS DELAIMOY_J_INTER_RAA

FROM
Ide_patient AS patient
JOIN patient.pms_edgars AS redg
JOIN redg.bas_uf AS uf_ex
JOIN redg.pms_edgar_actes AS acte
JOIN acte.bas_catalogue_gen_by_Edgr_id_cage_nature AS type
JOIN acte.pms_raas as raa
JOIN patient.pms_edgars AS redg2
JOIN redg2.bas_uf AS uf_ex2
JOIN redg2.pms_edgar_actes AS acte2
JOIN acte2.bas_catalogue_gen_by_Edgr_id_cage_nature AS type2
JOIN acte2.pms_raas as raa2
JOIN uf_ex.bas_etablissement AS etab
JOIN uf_ex.bas_uf_by_Unfo_id_unfo_grp as grp
JOIN uf_ex.bas_categorie_ufm AS cufm

WHERE
etab.id = <ETAB>
AND raa.traa_date BETWEEN INVITE(D: Actes exportés effectués entre le ) AND INVITE(D: et le )
AND type.cage_code NOT LIKE 'R%'
AND uf_ex.id = INVITE(B:UF_MED_FILT_VAL: File active+nouveaux patients pour cette UF exécutante)
AND raa.traa_dat_export IS NOT NULL
AND raa2.traa_date = (SELECT MIN(raa3.traa_date)
    FROM patient.pms_edgars AS redg3
    JOIN redg3.bas_uf AS uf_ex3
    JOIN redg3.pms_edgar_actes AS acte3
    JOIN acte3.bas_catalogue_gen_by_Edgr_id_cage_nature AS type3
    JOIN acte3.pms_raas as raa3
    WHERE raa3.traa_dat_export IS NOT NULL
    AND raa3.traa_date > raa.traa_date
    AND uf_ex3.id = uf_ex
    AND type3.cage_code NOT LIKE 'R%')

ORDER BY
patient.pati_nip, UPPER(cufm.cufm_libelle), grp.unfo_libelle, uf_ex.codeLibelle

https://whosebug.com/users/1766831/rick-james,这是最小的查询,没有增量计算,没有“聚合”函数

SELECT
HB3 patient.id AS PATI_ID,
uf_ex.codeLibelle AS UNITE,
raa.traa_date AS DATE_CONSULT_DATE

FROM
Ide_patient AS patient
JOIN patient.pms_edgars AS redg
JOIN redg.bas_uf AS uf_ex
JOIN redg.pms_edgar_actes AS acte
JOIN acte.bas_catalogue_gen_by_Edgr_id_cage_nature AS type
JOIN acte.pms_raas as raa
JOIN uf_ex.bas_etablissement AS etab

WHERE
etab.id = <ETAB>
AND raa.traa_date BETWEEN INVITE(D: consultations between ) AND INVITE(D: and )
AND type.cage_code NOT LIKE 'R%'
AND uf_ex.id = INVITE(B:UF_MED_FILT_VAL: consultations done in this care-unit)
AND raa.traa_dat_export IS NOT NULL

ORDER BY
GROUP BY uf_ex.codeLibelle, patient.id, raa.traa_date

=> type.cage_code 的第一个字母表示“咨询类型” IN ('E','D','G' ,'A','R'), 'R'被排除在外,因为患者不在场(医疗队会议)

=> 目标是针对同一患者的所有会诊(R 除外)计算一个时间间隔内两次连续会诊之间的差值。 raa.traa_date 的日期格式包括小时、分钟、秒。

=> uf_ex.id为实际咨询的医疗care-unitID

第 1 步。CREATE TABLE tblpati_iduniteconsult_date。另外,第 4 列是 AUTO_INCREMENT PRIMARY KEY;我们称它为 id。 (如果您使用的是 8.0 或 10.2,请使用“CTE”和 WITH。)

第 2 步。使用上面的 'minimal' 查询填充 3 列,让 id 自行填充。请务必包含 ORDER BY pati_id, consult_date。 (也许 unite?)

第 3 步。ALTER TABLE tbl ADD INDEX(pati_id, id)

第 4 步。将 table 与自身进行自连接,但偏移 id:

SELECT  pati_id,
        DATEDIFF(t2.consult_date, t1.consult_date) AS gap
    FROM tbl AS t1
    JOIN tbl AS t2  ON t2.pati_id = t1.pati_id
                   AND t2.id = t1.id + 1

(我留给你来决定如何 UNITE 适合。)