PostgreSQL:优化计算子组总和占总和的百分比

时间:2020-04-29 05:34:59

标签: sql postgresql postgresql-9.5

我编写了一个查询,以在窗口时间内计算总风险和所有风险= 1的总和。该查询仅需40万条记录就需要大约800毫秒的时间,是否可以改善以下查询。

我要在此处实现的是,计算给定窗口时间内的所有风险总和与风险总和之比,以便我可以计算给定窗口时间内风险项目的百分比

SELECT
    e.entity_uuid AS "entityUuid",
    SUM(e.count) AS "totalSum",
    tvc.tvcsum AS "totalRiskySum",
    ROUND(tvc.tvcsum * 1.0 / SUM(e.count) * 100, 2)::FLOAT AS "percentage"
    FROM address_entity e
LEFT JOIN (
    SELECT
    e.entity_uuid,
    SUM(e.count) AS "tvcsum"
    FROM address_entity e
    WHERE e.depth = 1
      AND e.monitoring_report_id IN (
        SELECT m.id FROM monitoring_report m
                WHERE m.report_date BETWEEN '2020-03-01' AND '2020-03-29'
      )
      AND e.entity_uuid IN ('393996d1-8df4-414f-8534-bd96f49ce16d','b6497c14-4264-4054-abd3-cb8594fb5072','c2fd62b3-47b3-4fd9-a4ff-a9cf847cd134','e9fa9758-e856-4ce1-9a3a-d0d4b0c35977','5dd4b3b6-cebd-4ce6-93fd-6e59ba8420e7','10d31034-2725-4ac5-937e-4b84e90e3be9')
      AND e.category IN ( SELECT category_uuid FROM wiki_entity WHERE risky = 1 GROUP BY category_uuid)
    GROUP BY e.entity_uuid
) tvc ON tvc.entity_uuid = e.entity_uuid
    WHERE e.depth = 1
      AND e.monitoring_report_id IN (
        SELECT m.id FROM monitoring_report m
                WHERE m.report_date BETWEEN '2020-03-01' AND '2020-03-29'
      )
      AND e.entity_uuid IN ('393996d1-8df4-414f-8534-bd96f49ce16d','b6497c14-4264-4054-abd3-cb8594fb5072','c2fd62b3-47b3-4fd9-a4ff-a9cf847cd134','e9fa9758-e856-4ce1-9a3a-d0d4b0c35977','5dd4b3b6-cebd-4ce6-93fd-6e59ba8420e7','10d31034-2725-4ac5-937e-4b84e90e3be9')
    GROUP BY e.entity_uuid, tvc.tvcsum

此SQL查询做什么?

SELECT和LEFT JOIN都使用相同的过滤器集(在WHERE子句中)查询同一张表,唯一的区别是LEFT JOIN添加了附加过滤器,以限制选择risky = 1的行,其中外部选择所有行。

因此,我们在第一选择中获得总和,在左联接中也获得risky = 1,现在我们可以轻松地计算给定时间范围内的风险百分比为AND e.monitoring_report_id IN ( SELECT m.id FROM monitoring_report m WHERE m.report_date BETWEEN '2020-03-01' AND '2020-03-29' )

查询的输出:

enter image description here

0 个答案:

没有答案
相关问题