fix: enp drain2serializer sql查询优化
This commit is contained in:
parent
fdc7ceff8d
commit
92bf0ac29e
|
@ -6,6 +6,7 @@ from rest_framework import serializers
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from apps.utils.sql import query_all_dict
|
from apps.utils.sql import query_all_dict
|
||||||
|
from apps.enp.sql import duration_hour_one_equip
|
||||||
|
|
||||||
|
|
||||||
class DrainSerializer(CustomModelSerializer):
|
class DrainSerializer(CustomModelSerializer):
|
||||||
|
@ -38,72 +39,27 @@ class Drain2Serializer(CustomModelSerializer):
|
||||||
today = str(now)[:10] + " 00:00:00"
|
today = str(now)[:10] + " 00:00:00"
|
||||||
today_last = str(now)[:10] + " 23:59:59"
|
today_last = str(now)[:10] + " 23:59:59"
|
||||||
odata = equips.values("id", "name", "type", "running_state")
|
odata = equips.values("id", "name", "type", "running_state")
|
||||||
eids = [f"'{e['id']}'" for e in odata]
|
# eids = [f"'{e['id']}'" for e in odata]
|
||||||
eids_str = ",".join(eids)
|
# eids_str = ",".join(eids)
|
||||||
sql_str = f"""
|
|
||||||
SELECT
|
|
||||||
equipment_id,
|
|
||||||
AVG ( tsp ) AS avg_tsp,
|
|
||||||
SUM ( duration_online ) AS total_duration_online,
|
|
||||||
SUM ( duration_run ) AS total_duration_run,
|
|
||||||
SUM ( duration_standby ) AS total_duration_standby,
|
|
||||||
MAX ( last_running_state ) AS last_running_state
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
SELECT
|
|
||||||
equipment_id,
|
|
||||||
tsp,
|
|
||||||
running_state,
|
|
||||||
CASE
|
|
||||||
|
|
||||||
WHEN running_state != 50 THEN
|
|
||||||
TIME - LAG ( TIME ) OVER ( PARTITION BY equipment_id ORDER BY TIME ) ELSE'0'
|
|
||||||
END AS duration_online,
|
|
||||||
CASE
|
|
||||||
|
|
||||||
WHEN running_state = 10 THEN
|
|
||||||
TIME - LAG ( TIME ) OVER ( PARTITION BY equipment_id ORDER BY TIME ) ELSE'0'
|
|
||||||
END AS duration_run,
|
|
||||||
CASE
|
|
||||||
|
|
||||||
WHEN running_state in (20, 30, 40) THEN
|
|
||||||
TIME - LAG ( TIME ) OVER ( PARTITION BY equipment_id ORDER BY TIME ) ELSE'0'
|
|
||||||
END AS duration_standby,
|
|
||||||
CASE
|
|
||||||
|
|
||||||
WHEN ROW_NUMBER ( ) OVER ( PARTITION BY equipment_id ORDER BY TIME DESC ) = 1 THEN
|
|
||||||
running_state ELSE NULL
|
|
||||||
END AS last_running_state
|
|
||||||
FROM
|
|
||||||
enp_envdata
|
|
||||||
WHERE
|
|
||||||
TIMEX >= '{today}' -- 替换成想查询的开始时间
|
|
||||||
|
|
||||||
AND TIMEX <= '{today_last}' -- 替换成想查询的结束时间
|
|
||||||
|
|
||||||
AND equipment_id IN ( {eids_str} )
|
|
||||||
) AS durations
|
|
||||||
GROUP BY
|
|
||||||
equipment_id;
|
|
||||||
"""
|
|
||||||
res = query_all_dict(sql_str)
|
|
||||||
data = {}
|
|
||||||
for i in res:
|
|
||||||
data[i["equipment_id"]] = i
|
|
||||||
|
|
||||||
for i in odata:
|
for i in odata:
|
||||||
i.update(
|
i.update(
|
||||||
data.get(
|
{
|
||||||
i["id"],
|
"avg_tsp": None,
|
||||||
{
|
"duration_offline": 0,
|
||||||
"avg_tsp": None,
|
"duration_run": 0,
|
||||||
"total_duration_online": 0,
|
"duration_stop": 0,
|
||||||
"total_duration_run": 0,
|
}
|
||||||
"total_duration_standby": 0,
|
|
||||||
"last_running_state": 50,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
equipment_id = i["id"]
|
||||||
|
sql_str = duration_hour_one_equip.format(equipment_id=equipment_id, start_time=today, end_time=today_last)
|
||||||
|
res = query_all_dict(sql_str)
|
||||||
|
# data = {}
|
||||||
|
# for i in res:
|
||||||
|
# data[i["equipment_id"]] = i
|
||||||
|
|
||||||
|
# for i in odata:
|
||||||
|
if res:
|
||||||
|
i.update(res[0])
|
||||||
|
|
||||||
return odata
|
return odata
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
# 一些sql语句
|
||||||
|
|
||||||
|
duration_hour_one_equip = """
|
||||||
|
WITH time_data AS (
|
||||||
|
SELECT
|
||||||
|
TO_CHAR( G.TIMEX, 'YYYY-MM-DD HH24:MI:SS' ) AS TIMEX
|
||||||
|
FROM
|
||||||
|
generate_series ( '{start_time}' :: TIMESTAMP, '{end_time}' :: TIMESTAMP, '1 minute' ) G ( TIMEX )
|
||||||
|
),
|
||||||
|
ev_data AS (
|
||||||
|
SELECT
|
||||||
|
TO_CHAR( time_bucket ( '1 minute', TIMEX ) AT TIME ZONE'Asia/Shanghai', 'YYYY-MM-DD HH24:MI:SS' ) AS timex,
|
||||||
|
MAX ( running_state ) AS running_state,
|
||||||
|
AVG ( tsp ) AS avg_tsp
|
||||||
|
FROM
|
||||||
|
enp_envdata envdata
|
||||||
|
WHERE
|
||||||
|
envdata.equipment_id = '{equipment_id}'
|
||||||
|
AND envdata.TIMEX AT TIME ZONE'Asia/Shanghai' >= '{start_time}'
|
||||||
|
AND envdata.TIMEX AT TIME ZONE'Asia/Shanghai' <= '{end_time}'
|
||||||
|
GROUP BY
|
||||||
|
time_bucket ( '1 minute', TIMEX ) AT TIME ZONE'Asia/Shanghai'
|
||||||
|
ORDER BY
|
||||||
|
timex
|
||||||
|
),
|
||||||
|
state_d AS (
|
||||||
|
SELECT
|
||||||
|
avg_tsp,
|
||||||
|
COALESCE
|
||||||
|
( ed.running_state, 50 ) AS running_state
|
||||||
|
FROM
|
||||||
|
time_data td
|
||||||
|
LEFT JOIN ev_data ed ON ed.timex = td.timex
|
||||||
|
ORDER BY
|
||||||
|
td.timex
|
||||||
|
) SELECT
|
||||||
|
ROUND( cast(AVG ( avg_tsp ) as numeric), 4) AS avg_tsp,
|
||||||
|
ROUND( SUM ( CASE WHEN running_state = 10 THEN 1 ELSE 0 END ) / 60.0, 2 ) AS duration_run,
|
||||||
|
ROUND( SUM ( CASE WHEN running_state = 30 THEN 1 ELSE 0 END ) / 60.0, 2 ) AS duration_stop,
|
||||||
|
ROUND( SUM ( CASE WHEN running_state = 50 THEN 1 ELSE 0 END ) / 60.0, 2 ) AS duration_offline
|
||||||
|
FROM
|
||||||
|
state_d;
|
||||||
|
"""
|
Loading…
Reference in New Issue