From 5799ca158c43e9c74a7a7eeb88a0b03a02513a68 Mon Sep 17 00:00:00 2001
From: kaiyu <404897439@qq.com>
Date: Mon, 02 Nov 2020 14:45:43 +0800
Subject: [PATCH] 修改平均风向SQL语句

---
 src/main/resources/mapper/HistoryMapper.xml |  284 +++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 197 insertions(+), 87 deletions(-)

diff --git a/src/main/resources/mapper/HistoryMapper.xml b/src/main/resources/mapper/HistoryMapper.xml
index 4e677f0..0827a7e 100644
--- a/src/main/resources/mapper/HistoryMapper.xml
+++ b/src/main/resources/mapper/HistoryMapper.xml
@@ -1,94 +1,110 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.moral.mapper.HistoryMapper">
-  <resultMap id="BaseResultMap" type="com.moral.entity.History">
-    <result column="mac" jdbcType="VARCHAR" property="mac" />
-    <result column="value" jdbcType="OTHER" property="value" />
-    <result column="time" jdbcType="TIMESTAMP" property="time" />
-    <result column="version" jdbcType="INTEGER" property="version" />
-  </resultMap>
-  <insert id="insert" parameterType="com.moral.entity.History">
+    <resultMap id="BaseResultMap" type="com.moral.entity.History">
+        <result column="mac" jdbcType="VARCHAR" property="mac"/>
+        <result column="value" jdbcType="OTHER" property="value"/>
+        <result column="time" jdbcType="TIMESTAMP" property="time"/>
+        <result column="version" jdbcType="INTEGER" property="version"/>
+    </resultMap>
+    <insert id="insert" parameterType="com.moral.entity.History">
     insert into history (mac, value, time, 
       version)
     values (#{mac,jdbcType=VARCHAR}, #{value,jdbcType=OTHER}, #{time,jdbcType=TIMESTAMP}, 
       #{version,jdbcType=INTEGER})
   </insert>
-  <insert id="insertSelective" parameterType="com.moral.entity.History">
-    insert into history
-    <trim prefix="(" suffix=")" suffixOverrides=",">
-      <if test="mac != null">
-        mac,
-      </if>
-      <if test="value != null">
-        value,
-      </if>
-      <if test="time != null">
-        time,
-      </if>
-      <if test="version != null">
-        version,
-      </if>
-    </trim>
-    <trim prefix="values (" suffix=")" suffixOverrides=",">
-      <if test="mac != null">
-        #{mac,jdbcType=VARCHAR},
-      </if>
-      <if test="value != null">
-        #{value,jdbcType=OTHER},
-      </if>
-      <if test="time != null">
-        #{time,jdbcType=TIMESTAMP},
-      </if>
-      <if test="version != null">
-        #{version,jdbcType=INTEGER},
-      </if>
-    </trim>
-  </insert>
-	<select id="getAvgData" resultType="java.util.Map">
-		SELECT
-			<foreach  collection="sensorKeys" separator="," item="sensorKey">
-				AVG(value->'$.${sensorKey}') AS '${sensorKey}'
-			</foreach>
-		FROM
-			history h
-		WHERE
-			h.time >= #{start}
-		AND h.time <![CDATA[<]]> #{end}
-		AND	h.mac = #{mac}
-	</select>
-	<select id="getMaxAndMinData" resultType="java.util.Map">
-		SELECT
-			<foreach  collection="sensorKeys" separator="," item="sensorKey">
-				max(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'max${sensorKey}',
-            	MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'min${sensorKey}'
-			</foreach>
-		FROM
-			history h
-		WHERE
-			h.time >= #{start}
-		AND h.time <![CDATA[<]]> #{end}
-		AND	h.mac = #{mac}
-	</select>
-	<select id="getMinData" resultType="java.util.Map">
-		SELECT
-			<foreach  collection="sensorKeys" separator="," item="sensorKey">
-				MIN(value->'$.${sensorKey}') AS '${sensorKey}'
-			</foreach>
-		FROM
-			history h
-		WHERE
-			h.time >= #{start}
-		AND h.time <![CDATA[<]]> #{end}
-		AND	h.mac = #{mac}
-	</select>
+    <insert id="insertSelective" parameterType="com.moral.entity.History">
+        insert into history
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="mac != null">
+                mac,
+            </if>
+            <if test="value != null">
+                value,
+            </if>
+            <if test="time != null">
+                time,
+            </if>
+            <if test="version != null">
+                version,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="mac != null">
+                #{mac,jdbcType=VARCHAR},
+            </if>
+            <if test="value != null">
+                #{value,jdbcType=OTHER},
+            </if>
+            <if test="time != null">
+                #{time,jdbcType=TIMESTAMP},
+            </if>
+            <if test="version != null">
+                #{version,jdbcType=INTEGER},
+            </if>
+        </trim>
+    </insert>
+    <select id="getAvgData" resultType="java.util.Map">
+        SELECT
+        <foreach collection="sensorKeys" separator="," item="sensorKey">
+            AVG(value->'$.${sensorKey}') AS '${sensorKey}'
+        </foreach>
+        FROM
+        history h
+        WHERE
+        h.time >= #{start}
+        AND h.time <![CDATA[<]]> #{end}
+        AND h.mac = #{mac}
+    </select>
+    <select id="getMaxAndMinData" resultType="java.util.Map">
+        SELECT
+        <foreach collection="sensorKeys" separator="," item="sensorKey">
+            max(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'max${sensorKey}',
+            MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'min${sensorKey}'
+        </foreach>
+        FROM
+        history h
+        WHERE
+        h.time >= #{start}
+        AND h.time <![CDATA[<]]> #{end}
+        AND h.mac = #{mac}
+    </select>
+    <select id="getMinData" resultType="java.util.Map">
+        SELECT
+        <foreach collection="sensorKeys" separator="," item="sensorKey">
+            MIN(value->'$.${sensorKey}') AS '${sensorKey}'
+        </foreach>
+        FROM
+        history h
+        WHERE
+        h.time >= #{start}
+        AND h.time <![CDATA[<]]> #{end}
+        AND h.mac = #{mac}
+    </select>
 
     <select id="getSensorData" resultType="java.util.LinkedHashMap">
         SELECT
         h.mac,
-        <foreach  collection="sensorKeys" separator="," item="sensorKey">
-            AVG(value->'$.${sensorKey}') AS '${sensorKey}',
-            MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
-            MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+        <foreach collection="sensorKeys" separator="," item="sensorKey">
+            <choose >
+            <when test="sensorKey=='e23'">
+            ROUND((CASE    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))<![CDATA[>]]>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[>]]>0
+                THEN ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI()
+                WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[<]]>0
+                THEN (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+180
+                WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))<![CDATA[<]]>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[<]]>0
+                THEN (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+180
+                ELSE (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+360
+                END),3) AS '${sensorKey}',
+                MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
+                MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+            </when>
+            <otherwise>
+                AVG(value->'$.${sensorKey}') AS '${sensorKey}',
+                MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
+                MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+            </otherwise>
+            </choose>
         </foreach>
         FROM
         history h
@@ -102,10 +118,26 @@
     <select id="getSensorDataByMac" resultType="java.util.LinkedHashMap">
         SELECT
         h.mac,
-        <foreach  collection="sensorKeys" separator="," item="sensorKey">
-            AVG(value->'$.${sensorKey}') AS '${sensorKey}',
-            MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
-            MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+        <foreach collection="sensorKeys" separator="," item="sensorKey">
+            <choose >
+                <when test="sensorKey=='e23'">
+                    ROUND((CASE    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))<![CDATA[>]]>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[>]]>0
+                    THEN ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI()
+                    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[<]]>0
+                    THEN (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+180
+                    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))<![CDATA[<]]>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[<]]>0
+                    THEN (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+180
+                    ELSE (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+360
+                    END),3) AS '${sensorKey}',
+                    MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
+                    MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+                </when>
+                <otherwise>
+                    AVG(value->'$.${sensorKey}') AS '${sensorKey}',
+                    MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
+                    MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+                </otherwise>
+            </choose>
         </foreach>
         FROM
         history h
@@ -120,13 +152,66 @@
         h.mac
     </select>
 
+    <select id="getSensorDataByMacOnce" resultType="java.util.LinkedHashMap">
+        SELECT
+        h.mac,DATE_FORMAT(time,'%Y-%m-%dT%H:%i') time,
+        <foreach collection="sensorKeys" separator="," item="sensorKey">
+            <choose >
+                <when test="sensorKey=='e23'">
+                    ROUND((CASE    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))<![CDATA[>]]>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[>]]>0
+                    THEN ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI()
+                    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[<]]>0
+                    THEN (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+180
+                    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))<![CDATA[<]]>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[<]]>0
+                    THEN (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+180
+                    ELSE (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+360
+                    END),3) AS '${sensorKey}',
+                    MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
+                    MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+                </when>
+                <otherwise>
+                    AVG(value->'$.${sensorKey}') AS '${sensorKey}',
+                    MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
+                    MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+                </otherwise>
+            </choose>
+        </foreach>
+        FROM
+        history h
+        WHERE
+        h.time >= #{start}
+        AND h.time <![CDATA[<]]> #{end}
+        and h.mac in
+        <foreach collection="macList" index="index" item="mac" open="(" separator="," close=")">
+            #{mac}
+        </foreach>
+        group by
+        h.mac,DATE_FORMAT(time,'%Y-%m-%dT%H:%i')
+    </select>
+
     <select id="getSensorDataOnce" resultType="java.util.LinkedHashMap">
         SELECT
         h.mac,DATE_FORMAT(time,'%Y-%m-%dT%H:%i') time,
-        <foreach  collection="sensorKeys" separator="," item="sensorKey">
-            AVG(value->'$.${sensorKey}') AS '${sensorKey}',
-            MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
-            MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+        <foreach collection="sensorKeys" separator="," item="sensorKey">
+            <choose >
+                <when test="sensorKey=='e23'">
+                    ROUND((CASE    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))<![CDATA[>]]>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[>]]>0
+                    THEN ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI()
+                    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[<]]>0
+                    THEN (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+180
+                    WHEN AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))<![CDATA[<]]>0 AND AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI()))<![CDATA[<]]>0
+                    THEN (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+180
+                    ELSE (ATAN(AVG(value->'$.e18'*SIN((value->'$.e23'/180)*PI()))/AVG(value->'$.e18'*COS((value->'$.e23'/180)*PI())))*180/PI())+360
+                    END),3) AS '${sensorKey}',
+                    MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
+                    MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+                </when>
+                <otherwise>
+                    AVG(value->'$.${sensorKey}') AS '${sensorKey}',
+                    MAX(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MAX${sensorKey}',
+                    MIN(cast(h.value ->'$.${sensorKey}' as decimal(11,3))) AS 'MIN${sensorKey}'
+                </otherwise>
+            </choose>
         </foreach>
         FROM
         history h
@@ -137,4 +222,29 @@
         h.mac,DATE_FORMAT(time,'%Y-%m-%dT%H:%i')
     </select>
 
+    <select id="selectByMacAndTime" resultType="com.moral.entity.History">
+        SELECT *
+        from history
+        WHERE time = #{time} and mac in
+        <foreach collection="macList" index="index" item="mac" open="(" separator="," close=")">
+            #{mac}
+        </foreach>
+    </select>
+
+    <insert id="insertHistorySpecialTable">
+        insert into
+        history_special(mac, value, time,version)
+        SELECT * from history WHERE time>=#{startTime} and time<![CDATA[<]]>#{endTime} and mac in
+        <foreach collection="macList" index="index" item="mac" open="(" separator="," close=")">
+            #{mac}
+        </foreach>
+    </insert>
+
+    <delete id="deleteHistoryData" parameterType="java.lang.String">
+        delete from history where  time &lt; #{oldTime};
+    </delete>
+
+    <update id="deletePartition">
+        ALTER table history drop PARTITION ${p};
+    </update>
 </mapper>
\ No newline at end of file

--
Gitblit v1.8.0