fix: 修复SQL Server排序规则冲突并排除异常数据

- 添加 COLLATE DATABASE_DEFAULT 解决 SQL Server JOIN 和 COALESCE 排序规则冲突
- 排除位移异常标记值 9999999.0000
- 修正湿度有效范围上限为 99
- 修正位移字段名为 displacement
- 收紧温度过滤范围为 0-79
main
zch 3 weeks ago
parent f37ac5b1bc
commit fa16c6b352

@ -31,7 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
noise,
concentration,
vibration_speed,
vibration_displacement,
displacement as vibration_displacement,
vibration_acceleration,
vibration_temp,
collectTime,
@ -136,12 +136,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectRecordIotenvInstantListFromTables" resultMap="RecordIotenvInstantResult">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.objid, t.monitorId, t.temperature, t.humidity, t.illuminance, t.noise, t.concentration,
t.vibration_speed, t.vibration_displacement, t.vibration_acceleration, t.vibration_temp,
t.vibration_speed, t.displacement as vibration_displacement, t.vibration_acceleration, t.vibration_temp,
t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitor_name,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitor_name,
t.monitorId AS monitor_code
FROM ${tableName} t
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId = ebmi.monitor_code
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
<where>
<if test="recordIotenvInstant.monitorId != null and recordIotenvInstant.monitorId != ''"> and t.monitorId = #{recordIotenvInstant.monitorId}</if>
<if test="recordIotenvInstant.temperature != null "> and t.temperature = #{recordIotenvInstant.temperature}</if>
@ -170,7 +170,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 过滤异常数据:温度、湿度、噪声范围 [0, 79] -->
<!-- 这里沿用范围过滤和空值判断,避免无意义的数据点拖慢历史查询。 -->
AND (t.temperature IS NULL OR t.temperature BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 99)
AND (t.noise IS NULL OR t.noise BETWEEN 0 AND 79)
<!-- 根据设备类型过滤掉负责字段为0的数据 -->
@ -182,8 +182,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
(ebmi.monitor_type = 6 AND (t.temperature > 0 OR t.humidity > 0)) OR
-- 噪声设备(type=7)过滤噪声为0的数据
(ebmi.monitor_type = 7 AND t.noise > 0) OR
-- 振动设备(type=10)过滤振动相关字段都为0的数据
(ebmi.monitor_type = 10 AND (t.vibration_speed > 0 OR t.vibration_displacement > 0 OR t.vibration_acceleration > 0 OR t.vibration_temp > 0)) OR
-- 振动设备(type=10)过滤振动相关字段都为0的数据,并排除位移异常标记值 9999999.0000
(ebmi.monitor_type = 10 AND (t.vibration_speed > 0 OR (t.displacement > 0 AND t.displacement != 9999999.0000) OR t.vibration_acceleration > 0 OR t.vibration_temp > 0)) OR
-- 其他类型设备或无设备信息:保留所有有效数据
(ebmi.monitor_type NOT IN (5, 6, 7, 10) OR ebmi.monitor_type IS NULL)
)
@ -202,12 +202,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
FROM (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
(SELECT t.objid, t.monitorId, t.temperature, t.humidity, t.illuminance, t.noise, t.concentration,
t.vibration_speed, t.vibration_displacement, t.vibration_acceleration, t.vibration_temp,
t.vibration_speed, t.displacement as vibration_displacement, t.vibration_acceleration, t.vibration_temp,
t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) as monitor_name,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) as monitor_name,
t.monitorId as monitor_code
FROM ${tableName} t
left join ems_base_monitor_info ebmi on t.monitorId = ebmi.monitor_code
left join ems_base_monitor_info ebmi on t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
<where>
<if test="recordIotenvInstant.monitorId != null and recordIotenvInstant.monitorId != ''"> and t.monitorId = #{recordIotenvInstant.monitorId}</if>
<if test="recordIotenvInstant.temperature != null "> and t.temperature = #{recordIotenvInstant.temperature}</if>
@ -236,7 +236,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 过滤异常数据:温度、湿度、噪声范围 [0, 79] -->
<!-- 这里沿用范围过滤和空值判断,避免无意义的数据点拖慢历史查询。 -->
AND (t.temperature IS NULL OR t.temperature BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 99)
AND (t.noise IS NULL OR t.noise BETWEEN 0 AND 79)
<!-- 根据设备类型过滤掉负责字段为0的数据 -->
@ -255,7 +255,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t.vibration_speed > 0 AND t.vibration_speed &lt; 80
</when>
<when test="recordIotenvInstant.vibrationParam == 'vibrationDisplacement'">
t.vibration_displacement > 0 AND t.vibration_displacement &lt; 80
t.displacement > 0 AND t.displacement != 9999999.0000
</when>
<when test="recordIotenvInstant.vibrationParam == 'vibrationAcceleration'">
t.vibration_acceleration > 0 AND t.vibration_acceleration &lt; 80
@ -264,7 +264,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t.vibration_temp > 0 AND t.vibration_temp &lt; 80
</when>
<otherwise>
t.vibration_speed > 0 OR t.vibration_displacement > 0 OR t.vibration_acceleration > 0 OR t.vibration_temp > 0
t.vibration_speed > 0 OR (t.displacement > 0 AND t.displacement != 9999999.0000) OR t.vibration_acceleration > 0 OR t.vibration_temp > 0
</otherwise>
</choose>
)) OR
@ -293,7 +293,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.objid
FROM ${tableName} t
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId = ebmi.monitor_code
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
<where>
<if test="recordIotenvInstant.monitorId != null and recordIotenvInstant.monitorId != ''"> and t.monitorId = #{recordIotenvInstant.monitorId}</if>
<if test="recordIotenvInstant.temperature != null "> and t.temperature = #{recordIotenvInstant.temperature}</if>
@ -322,7 +322,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 过滤异常数据:温度、湿度、噪声范围 [1, 79] -->
<!-- 这里沿用范围过滤和空值判断,避免无意义的数据点拖慢历史查询。 -->
AND (t.temperature IS NULL OR t.temperature BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 99)
AND (t.noise IS NULL OR t.noise BETWEEN 0 AND 79)
<!-- 过滤虚拟设备忽略is_ammeter为0的虚拟设备 -->
@ -390,10 +390,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT TOP (1) t.objid, t.monitorId, t.temperature, t.humidity, t.illuminance, t.noise, t.concentration,
t.vibration_speed, t.vibration_displacement, t.vibration_acceleration, t.vibration_temp,
t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitor_name,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitor_name,
t.monitorId AS monitor_code
FROM ${tableName} t
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId = ebmi.monitor_code
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
WHERE t.monitorId = #{monitorId}
ORDER BY t.recodeTime DESC, t.objid DESC
</select>
@ -403,10 +403,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT t1.objid, t1.monitorId, t1.temperature, t1.humidity, t1.illuminance, t1.noise, t1.concentration,
t1.vibration_speed, t1.vibration_displacement, t1.vibration_acceleration, t1.vibration_temp,
t1.collectTime, t1.recodeTime,
COALESCE(ebmi.monitor_name, t1.monitorId) AS monitor_name,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t1.monitorId COLLATE DATABASE_DEFAULT) AS monitor_name,
t1.monitorId AS monitor_code
FROM ${tableName} t1
LEFT JOIN ems_base_monitor_info ebmi ON t1.monitorId = ebmi.monitor_code
LEFT JOIN ems_base_monitor_info ebmi ON t1.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
INNER JOIN (
SELECT monitorId, MAX(objid) as max_objid
FROM ${tableName}
@ -425,10 +425,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT t.objid, t.monitorId, t.temperature, t.humidity, t.illuminance, t.noise, t.concentration,
t.vibration_speed, t.vibration_displacement, t.vibration_acceleration, t.vibration_temp,
t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitor_name,
t.monitorId AS monitor_code
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitor_name,
t.monitorId AS monitor_code
FROM ${tableName} t
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId = ebmi.monitor_code
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
<where>
<if test="monitorIds != null and monitorIds.size() > 0">
AND t.monitorId IN
@ -459,10 +459,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t1.objid, t1.monitorId, t1.temperature, t1.humidity, t1.illuminance, t1.noise, t1.concentration,
t1.vibration_speed, t1.vibration_displacement, t1.vibration_acceleration, t1.vibration_temp,
t1.collectTime, t1.recodeTime,
COALESCE(ebmi.monitor_name, t1.monitorId) AS monitor_name,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t1.monitorId COLLATE DATABASE_DEFAULT) AS monitor_name,
t1.monitorId AS monitor_code
FROM ${tableName} t1
LEFT JOIN ems_base_monitor_info ebmi ON t1.monitorId = ebmi.monitor_code
LEFT JOIN ems_base_monitor_info ebmi ON t1.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
INNER JOIN (
<!-- 用子查询先计算 time_slot避免 SELECT 和 GROUP BY 中各自生成不同的 ? 占位符导致 SQL Server 报错 -->
SELECT monitorId, time_slot, MAX(recodeTime) AS max_time FROM (
@ -485,7 +485,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) as time_slot,
t.recodeTime
FROM ${tableName} t
LEFT JOIN ems_base_monitor_info ebmi2 ON t.monitorId = ebmi2.monitor_code
LEFT JOIN ems_base_monitor_info ebmi2 ON t.monitorId COLLATE DATABASE_DEFAULT = ebmi2.monitor_code COLLATE DATABASE_DEFAULT
<where>
<if test="recordIotenvInstant.monitorId != null and recordIotenvInstant.monitorId != ''">
AND t.monitorId = #{recordIotenvInstant.monitorId}
@ -501,7 +501,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</if>
AND (t.temperature IS NULL OR t.temperature BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 99)
AND (t.noise IS NULL OR t.noise BETWEEN 0 AND 79)
<!-- 过滤虚拟设备忽略is_ammeter为0的虚拟设备 -->
@ -537,10 +537,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t.objid, t.monitorId, t.temperature, t.humidity, t.illuminance, t.noise, t.concentration,
t.vibration_speed, t.vibration_displacement, t.vibration_acceleration, t.vibration_temp,
t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) as monitor_name,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) as monitor_name,
t.monitorId as monitor_code
FROM ${tableName} t
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId = ebmi.monitor_code
LEFT JOIN ems_base_monitor_info ebmi ON t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
<where>
<!-- 单个设备查询 -->
<if test="recordIotenvInstant.monitorId != null and recordIotenvInstant.monitorId != ''">
@ -562,7 +562,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 过滤异常数据:温度、湿度、噪声范围 [0, 79] -->
AND (t.temperature IS NULL OR t.temperature BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 79)
AND (t.humidity IS NULL OR t.humidity BETWEEN 0 AND 99)
AND (t.noise IS NULL OR t.noise BETWEEN 0 AND 79)
</where>
</foreach>

@ -36,10 +36,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t.displacement AS vibration_displacement,
t.collectTime,
t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitor_name,
<choose>
<when test="_databaseId == null or _databaseId == '' or _databaseId == 'sqlserver' or _databaseId == 'sql_server' or _databaseId == 'mssql' or _databaseId == 'SQL Server' or _databaseId == 'SQLSERVER' or _databaseId == 'SQL_SERVER' or _databaseId == 'SqlServer'">
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitor_name,
</when>
<otherwise>
COALESCE(ebmi.monitor_name, t.monitorId) AS monitor_name,
</otherwise>
</choose>
t.monitorId AS monitor_code
</sql>
<!-- SQL Server databaseId 在不同配置下可能为空或命名不一致JOIN 字符串字段时统一兜底排序规则。 -->
<sql id="monitorJoinCondition">
<choose>
<when test="_databaseId == null or _databaseId == '' or _databaseId == 'sqlserver' or _databaseId == 'sql_server' or _databaseId == 'mssql' or _databaseId == 'SQL Server' or _databaseId == 'SQLSERVER' or _databaseId == 'SQL_SERVER' or _databaseId == 'SqlServer'">
t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
</when>
<otherwise>
t.monitorId = ebmi.monitor_code
</otherwise>
</choose>
</sql>
<!--
分析类 WHERE
1. 时间范围(参数化绑定 #{} 防注入)
@ -63,11 +82,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</choose>
AND t.displacement IS NOT NULL
AND t.displacement &gt; 0
AND t.displacement != 9999999.0000
</sql>
<!--
质量页 WHERE仅按时间/设备过滤,不做位移有效值过滤,
避免质量页分母被提前缩小导致覆盖率虚高。
但仍需排除异常标记值 9999999.0000。
-->
<sql id="baseWhereQuality">
t.recodeTime &gt;= #{query.beginRecordTime}
@ -83,6 +104,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</when>
</choose>
AND t.displacement != 9999999.0000
</sql>
<!--
@ -90,6 +112,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
INNER JOIN monitor_type = 10 确保只查振动类设备(现场物理意义:振动位移传感器挂在 type=10 下)。
${tableName} 虽然是拼接而非参数化,但 Service 已做白名单正则校验TABLE_NAME_PATTERN
此处是唯一允许 ${} 的位置。
SQL Server 排序规则冲突规避ON 条件中使用 COLLATE DATABASE_DEFAULT。
-->
<sql id="rawPageQuery">
SELECT *
@ -99,7 +122,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectColumns"/>
FROM ${tableName} t
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON <include refid="monitorJoinCondition"/>
AND ebmi.monitor_type = 10
<where>
<include refid="baseWhere"/>
@ -137,7 +160,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) AS rn
FROM ${tableName} t
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON <include refid="monitorJoinCondition"/>
AND ebmi.monitor_type = 10
<where>
<include refid="baseWhere"/>
@ -153,14 +176,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
collectTime,
recodeTime
FROM sampled
<!-- rn = 1 为每个“设备+时间桶”内最新的一条,效果等价于“每 N 分钟取一个位移采样点” -->
<!-- rn = 1 为每个"设备+时间桶"内最新的一条,效果等价于"每 N 分钟取一个位移采样点" -->
WHERE rn = 1
ORDER BY monitorId ASC, recodeTime ASC, objid ASC
</sql>
<!--
质量页原始查询:不按位移有效值过滤,
保证分母代表“本次查询实际采到的样本总数”。
保证分母代表"本次查询实际采到的样本总数"。
SQL Server 排序规则冲突规避ON 条件中使用 COLLATE DATABASE_DEFAULT。
-->
<sql id="rawQualityQuery">
SELECT *
@ -170,7 +194,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectColumns"/>
FROM ${tableName} t
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON <include refid="monitorJoinCondition"/>
AND ebmi.monitor_type = 10
<where>
<include refid="baseWhereQuality"/>
@ -183,6 +207,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!--
质量页抽样查询:仅做时间桶抽样,不做位移有效值过滤,
避免质量统计在 SQL 层被“分析口径”提前污染。
SQL Server 排序规则冲突规避ON 条件中使用 COLLATE DATABASE_DEFAULT。
-->
<sql id="samplingQualityQuery">
WITH sampled AS (
@ -206,7 +231,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) AS rn
FROM ${tableName} t
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON <include refid="monitorJoinCondition"/>
AND ebmi.monitor_type = 10
<where>
<include refid="baseWhereQuality"/>

@ -13,19 +13,30 @@
t.temperature,
t.collectTime,
t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
</sql>
<!-- 公共 JOIN只保留温度相关测点统一和振动看板保持相同的设备口径 -->
<!--
公共 JOIN只保留温度相关测点统一和振动看板保持相同的设备口径。
SQL Server 排序规则冲突规避ON 条件中使用 COLLATE DATABASE_DEFAULT。
-->
<sql id="baseJoin">
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON
<choose>
<when test="_databaseId == null or _databaseId == '' or _databaseId == 'sqlserver' or _databaseId == 'sql_server' or _databaseId == 'mssql' or _databaseId == 'SQL Server' or _databaseId == 'SQLSERVER' or _databaseId == 'SQL_SERVER' or _databaseId == 'SqlServer'">
t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
</when>
<otherwise>
t.monitorId = ebmi.monitor_code
</otherwise>
</choose>
AND ebmi.monitor_type IN (5, 6)
</sql>
<!-- 公共过滤:温度只要求有值,不再把 0℃ / 负温 / 高温场景误判成脏数据 -->
<!-- 公共过滤:屏蔽 0 以下和 80 以上的异常温度数据 -->
<sql id="tempFilter">
AND t.temperature IS NOT NULL
AND t.temperature BETWEEN 0 AND 79
</sql>
<!-- 公共时间过滤 -->
@ -57,7 +68,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -80,7 +91,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -122,7 +133,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -146,7 +157,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -170,7 +181,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -197,7 +208,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -223,7 +234,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -248,7 +259,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -273,7 +284,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -299,7 +310,7 @@
WITH all_data AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime, t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -327,7 +338,7 @@
SELECT
FORMAT(t.collectTime, 'yyyy-MM-dd HH:mm:00') AS statTime,
t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
ROUND(AVG(t.temperature), 2) AS avgTemp,
COUNT(*) AS sampleCount
FROM ${tableName} t
@ -338,7 +349,7 @@
<include refid="tempFilter"/>
</where>
GROUP BY FORMAT(t.collectTime, 'yyyy-MM-dd HH:mm:00'), t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId)
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY statTime
</select>
@ -349,7 +360,7 @@
SELECT
FORMAT(t.collectTime, 'yyyy-MM-dd HH:00:00') AS statTime,
t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
ROUND(AVG(t.temperature), 2) AS avgTemp,
ROUND(MAX(t.temperature), 2) AS maxTemp,
ROUND(MIN(t.temperature), 2) AS minTemp,
@ -362,7 +373,7 @@
<include refid="tempFilter"/>
</where>
GROUP BY FORMAT(t.collectTime, 'yyyy-MM-dd HH:00:00'), t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId)
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY statTime
</select>
@ -394,7 +405,7 @@
</otherwise>
</choose> AS statTime,
t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
ROUND(AVG(t.temperature), 2) AS avgTemp
FROM ${tableName} t
<include refid="baseJoin"/>
@ -421,7 +432,7 @@
</otherwise>
</choose>,
t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId)
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY statTime, monitorId
</select>
@ -499,7 +510,7 @@
WITH base AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -606,7 +617,7 @@
<select id="selectHighTempEvents" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardAnomalyVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
t.temperature,
t.collectTime,
'HIGH_TEMP' AS anomalyType
@ -642,7 +653,7 @@
<select id="selectLowTempEvents" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardAnomalyVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
t.temperature,
t.collectTime,
'LOW_TEMP' AS anomalyType
@ -679,7 +690,7 @@
WITH base AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -723,7 +734,7 @@
WITH base AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.temperature, t.collectTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -783,7 +794,7 @@
<select id="selectJitterAnomalies" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardAnomalyVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
FORMAT(t.collectTime, 'yyyy-MM-dd HH:00:00') AS statTime,
ROUND(AVG(t.temperature), 2) AS avgTemp,
ROUND(STDEVP(t.temperature), 4) AS tempStddev,
@ -794,7 +805,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId),
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT),
FORMAT(t.collectTime, 'yyyy-MM-dd HH:00:00')
HAVING STDEVP(t.temperature) >= #{stddevThreshold}
</foreach>
@ -807,7 +818,7 @@
<select id="selectAvgTempRanking" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardComparisonVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
ROUND(AVG(t.temperature), 2) AS avgTemp
FROM ${tableName} t
<include refid="baseJoin"/>
@ -815,7 +826,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY avgTemp DESC
</select>
@ -824,7 +835,7 @@
<select id="selectStabilityRanking" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardComparisonVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
ROUND(STDEVP(t.temperature), 4) AS tempStddev
FROM ${tableName} t
<include refid="baseJoin"/>
@ -832,7 +843,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY tempStddev ASC
</select>
@ -842,7 +853,7 @@
WITH today_avg AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
AVG(t.temperature) AS avgTemp
FROM ${tableName} t
<include refid="baseJoin"/>
@ -850,13 +861,13 @@
t.collectTime >= #{todayStartTime} AND t.collectTime &lt; #{todayEndTime}
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
),
yesterday_avg AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
AVG(t.temperature) AS avgTemp
FROM ${tableName} t
<include refid="baseJoin"/>
@ -864,7 +875,7 @@
t.collectTime >= #{yesterdayStartTime} AND t.collectTime &lt; #{yesterdayEndTime}
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
)
SELECT t.monitorId, t.monitorName,
@ -895,7 +906,7 @@
FROM (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
MAX(t.temperature) AS maxTemp,
MIN(t.temperature) AS minTemp,
SUM(t.temperature) AS sumTemp,
@ -906,7 +917,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
) sub
GROUP BY sub.monitorId, sub.monitorName
@ -917,7 +928,7 @@
<select id="selectFluctuationCompare" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardComparisonVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
MAX(t.temperature) - MIN(t.temperature) AS tempRange
FROM ${tableName} t
<include refid="baseJoin"/>
@ -925,7 +936,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY tempRange DESC
</select>
@ -960,7 +971,7 @@
<select id="selectTimeReversal" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardQualityVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
t.temperature,
t.collectTime,
t.recodeTime,
@ -1003,7 +1014,7 @@
WITH base AS (
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId, t.collectTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName
FROM ${tableName} t
<include refid="baseJoin"/>
<where>
@ -1053,7 +1064,7 @@
<select id="selectCompletenessRate" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardQualityVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
COUNT(*) AS actualCount,
#{expectedCount} AS expectedCount,
ROUND(CAST(COUNT(*) AS FLOAT) / #{expectedCount}, 4) AS completenessRate
@ -1063,7 +1074,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY completenessRate ASC
</select>
@ -1072,7 +1083,7 @@
<select id="selectMonitorActivity" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardQualityVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
COUNT(*) AS actualCount,
MIN(t.collectTime) AS firstTime,
MAX(t.collectTime) AS lastTime
@ -1082,7 +1093,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY actualCount DESC
</select>
@ -1158,7 +1169,7 @@
</otherwise>
</choose> AS statBucket,
t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
ROUND(AVG(t.temperature), 2) AS avgTemp
FROM ${tableName} t
<include refid="baseJoin"/>
@ -1178,7 +1189,7 @@
DATEADD(MINUTE, DATEDIFF(MINUTE, 0, t.collectTime), 0)
</otherwise>
</choose>,
t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
) sub
ORDER BY statTime, monitorId
@ -1189,7 +1200,7 @@
<select id="selectTreemapData" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardAdvancedVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
ROUND(AVG(t.temperature), 2) AS avgTemp,
COUNT(*) AS sampleCount
FROM ${tableName} t
@ -1198,7 +1209,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY avgTemp DESC
</select>
@ -1216,7 +1227,7 @@
ELSE '>=30'
END AS tempBucket,
t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
COUNT(*) AS sampleCount
FROM ${tableName} t
<include refid="baseJoin"/>
@ -1232,7 +1243,7 @@
WHEN t.temperature &lt; 30 THEN '25-30'
ELSE '>=30'
END,
t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY tempBucket, monitorId
</select>
@ -1242,7 +1253,7 @@
<select id="selectParallelData" resultType="org.dromara.ems.report.domain.vo.tempboard.TempBoardAdvancedVo">
<foreach collection="tableNames" item="tableName" separator=" UNION ALL ">
SELECT t.monitorId,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitorName,
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitorName,
ROUND(AVG(t.temperature), 2) AS avgTemp,
ROUND(MAX(t.temperature), 2) AS maxTemp,
ROUND(MIN(t.temperature), 2) AS minTemp,
@ -1254,7 +1265,7 @@
<include refid="timeFilter"/>
<include refid="tempFilter"/>
</where>
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name, t.monitorId)
GROUP BY t.monitorId, COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT)
</foreach>
ORDER BY avgTemp DESC
</select>

@ -49,10 +49,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t.vibration_temp,
t.collectTime,
t.recodeTime,
COALESCE(ebmi.monitor_name, t.monitorId) AS monitor_name,
<choose>
<when test="_databaseId == null or _databaseId == '' or _databaseId == 'sqlserver' or _databaseId == 'sql_server' or _databaseId == 'mssql' or _databaseId == 'SQL Server' or _databaseId == 'SQLSERVER' or _databaseId == 'SQL_SERVER' or _databaseId == 'SqlServer'">
COALESCE(ebmi.monitor_name COLLATE DATABASE_DEFAULT, t.monitorId COLLATE DATABASE_DEFAULT) AS monitor_name,
</when>
<otherwise>
COALESCE(ebmi.monitor_name, t.monitorId) AS monitor_name,
</otherwise>
</choose>
t.monitorId AS monitor_code
</sql>
<!-- SQL Server databaseId 在不同配置下可能为空或命名不一致JOIN 字符串字段时统一兜底排序规则。 -->
<sql id="monitorJoinCondition">
<choose>
<when test="_databaseId == null or _databaseId == '' or _databaseId == 'sqlserver' or _databaseId == 'sql_server' or _databaseId == 'mssql' or _databaseId == 'SQL Server' or _databaseId == 'SQLSERVER' or _databaseId == 'SQL_SERVER' or _databaseId == 'SqlServer'">
t.monitorId COLLATE DATABASE_DEFAULT = ebmi.monitor_code COLLATE DATABASE_DEFAULT
</when>
<otherwise>
t.monitorId = ebmi.monitor_code
</otherwise>
</choose>
</sql>
<!--
公共 WHERE 条件:
1. 时间范围——使用参数化绑定 #{} 防注入
@ -129,6 +148,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
INNER JOIN monitor_type = 10 确保只查振动设备——这是「振动报表独立口径」的 SQL 层保障。
${tableName} 虽然使用拼接而非参数化,但 Java 层已有白名单正则校验TABLE_NAME_PATTERN
此处是唯一允许 ${} 的位置。
SQL Server 排序规则冲突规避ON 条件中使用 COLLATE DATABASE_DEFAULT。
-->
<sql id="rawPageQuery">
SELECT *
@ -138,7 +158,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectColumns"/>
FROM ${tableName} t
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON <include refid="monitorJoinCondition"/>
AND ebmi.monitor_type = 10
<where>
<include refid="baseWhere"/>
@ -178,7 +198,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) AS rn
FROM ${tableName} t
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON <include refid="monitorJoinCondition"/>
AND ebmi.monitor_type = 10
<where>
<include refid="baseWhere"/>
@ -211,6 +231,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!--
质量页原始查询:与分析类查询不同,这里不按位移有效值过滤,
保证质量页分母代表“本次查询实际采到的样本数”。
SQL Server 排序规则冲突规避ON 条件中使用 COLLATE DATABASE_DEFAULT。
-->
<sql id="rawQualityQuery">
SELECT *
@ -220,7 +241,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectColumns"/>
FROM ${tableName} t
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON <include refid="monitorJoinCondition"/>
AND ebmi.monitor_type = 10
<where>
<include refid="baseWhereQuality"/>
@ -233,6 +254,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!--
质量页抽样查询:仅做时间桶抽样,不做位移有效值过滤,
避免质量统计在 SQL 层被“分析口径”提前污染。
SQL Server 排序规则冲突规避ON 条件中使用 COLLATE DATABASE_DEFAULT。
-->
<sql id="samplingQualityQuery">
WITH sampled AS (
@ -256,7 +278,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) AS rn
FROM ${tableName} t
INNER JOIN ems_base_monitor_info ebmi
ON t.monitorId = ebmi.monitor_code
ON <include refid="monitorJoinCondition"/>
AND ebmi.monitor_type = 10
<where>
<include refid="baseWhereQuality"/>

Loading…
Cancel
Save