Browse Source

【用户数据分析】【sql查询速度优化】-王公峰-2020-05-27

feature/dangjian
wanggongfeng 5 years ago
parent
commit
c6c7cf345f
  1. 389
      esua-epdc/epdc-module/epdc-analysis/epdc-analysis-server/src/main/resources/mapper/user/UserAnalysisDao.xml

389
esua-epdc/epdc-module/epdc-analysis/epdc-analysis-server/src/main/resources/mapper/user/UserAnalysisDao.xml

@ -381,61 +381,82 @@
) t
GROUP BY t.DEPT_ID-->
SELECT
t.DEPT_ID gridId, COUNT( t.ID ) registerCount,
COUNT(((t.AUTHENTICATED_TYPE='0' and t.AUTHENTICATED_FLAG = '1') or (t.AUTHENTICATED_TYPE='1' and t.AUTHENTICATED_FLAG = '0' AND t.HistoryCount > 0)) OR NULL) residentCount,
COUNT((t.AUTHENTICATED_TYPE='1' and t.AUTHENTICATED_FLAG = '1') OR NULL) partyCount
FROM (
user.DEPT_ID gridId,
COUNT(user.ID) AS registerCount,
COUNT((user.AUTHENTICATED_TYPE = '0' AND user.AUTHENTICATED_FLAG = '1') OR (user.AUTHENTICATED_TYPE = '1' AND user.AUTHENTICATED_FLAG = '0' AND user.HistoryCount > 0) OR NULL) AS residentCount ,
COUNT((user.AUTHENTICATED_TYPE = '1' AND user.AUTHENTICATED_FLAG = '1') OR NULL) AS partyCount
FROM
(
select newuu.ID,newuu.AUTHENTICATED_TYPE,newuu.AUTHENTICATED_FLAG,newuu.HistoryCount,newuu.DEPT_ID from (
SELECT
DISTINCT uu.ID,uu.DEL_FLAG,uu.CREATED_TIME,
(
SELECT
uu.ID, ifnull(if(uu.DEPT_ID = 0,null,uu.DEPT_ID),RELATION.Grid_id) DEPT_ID, uu.STATE, uu.PARTY_FLAG,
HISTORY.AUTHENTICATED_TYPE,HISTORY.AUTHENTICATED_FLAG,HISCOUNT.HistoryCount
AUTHENTICATED_TYPE
FROM
esua_epdc_user.epdc_user uu
LEFT JOIN (
SELECT MAX( CREATED_TIME ) AS CREATED_TIME, USER_ID
FROM esua_epdc_user.epdc_user_authenticate_history
WHERE DEL_FLAG = '0' AND AUTHENTICATED_TYPE IN ( '0', '1' )
esua_epdc_user.epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
</if>
GROUP BY USER_ID
) MAXHIS ON MAXHIS.USER_ID = uu.ID
LEFT JOIN esua_epdc_user.epdc_user_authenticate_history HISTORY ON HISTORY.USER_ID = MAXHIS.USER_ID AND HISTORY.CREATED_TIME = MAXHIS.CREATED_TIME AND HISTORY.DEL_FLAG = '0'
LEFT JOIN (
AND USER_ID = uu.ID
ORDER BY
CREATED_TIME DESC,
id
LIMIT 1
) AS AUTHENTICATED_TYPE,
(
SELECT
count(id) AS HistoryCount,
USER_ID
AUTHENTICATED_FLAG
FROM
esua_epdc_user.epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
AND AUTHENTICATED_FLAG= '1'
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
</if>
GROUP BY USER_ID
) HISCOUNT ON HISCOUNT.USER_ID = uu.ID
LEFT JOIN (
SELECT MIN( CREATED_TIME ) AS CREATED_TIME,
USER_ID FROM esua_epdc_user.epdc_user_grid_relation
AND USER_ID = uu.ID
ORDER BY
CREATED_TIME DESC ,
id
LIMIT 1
) AS AUTHENTICATED_FLAG,
(
SELECT
count( id ) AS HistoryCount
FROM
esua_epdc_user.epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
GROUP BY
USER_ID
) MINRELA ON MINRELA.USER_ID = uu.ID
LEFT JOIN esua_epdc_user.epdc_user_grid_relation RELATION ON RELATION.USER_ID = MINRELA.USER_ID AND RELATION.DEL_FLAG = '0' AND MINRELA.CREATED_TIME = RELATION.CREATED_TIME
WHERE
uu.DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
AND AUTHENTICATED_FLAG = '1'
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
</if>
AND USER_ID = uu.ID
) AS HistoryCount,
ifnull(if(uu.DEPT_ID = 0, NULL, uu.DEPT_ID), (
SELECT GRID_ID FROM esua_epdc_user.epdc_user_grid_relation
WHERE DEL_FLAG = '0' AND USER_ID = uu.ID
ORDER BY
CREATED_TIME,
id
LIMIT 1
)) AS DEPT_ID
FROM
esua_epdc_user.epdc_user uu ) newuu
where newuu.DEL_FLAG = '0'
<if test="gridIdList != null and gridIdList.size() > 0">
AND ifnull(if(uu.DEPT_ID = 0,null,uu.DEPT_ID),RELATION.Grid_id) in <include refid="foreachGridIdList"></include>
AND newuu.DEPT_ID in <include refid="foreachGridIdList"></include>
</if>
<if test="startTime != null and endTime != null and endTime != ''">
AND DATE_FORMAT(uu.CREATED_TIME,'%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
AND DATE_FORMAT(newuu.CREATED_TIME,'%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
</if>
) t
GROUP BY t.DEPT_ID
) user
GROUP BY user.DEPT_ID
</select>
<select id="selectCountGridWorkOrNot"
@ -540,67 +561,97 @@
left join
(
SELECT
t0.id,
t0.`name` streetName,
count(uu.id) userTotal,
count((HISTORY.AUTHENTICATED_TYPE='1' and HISTORY.AUTHENTICATED_FLAG = '1') or null ) AS partyCount
t0.ID as DEPT_ID,
COUNT(user.ID) AS userTotal,
COUNT((user.AUTHENTICATED_TYPE = '1' AND user.AUTHENTICATED_FLAG = '1') OR NULL) AS partyCount
FROM (
SELECT
DISTINCT uu.ID,
(
SELECT
AUTHENTICATED_TYPE
FROM
esua_epdc_user.epdc_user uu
LEFT JOIN (
SELECT MIN( CREATED_TIME ) AS CREATED_TIME,
USER_ID FROM esua_epdc_user.epdc_user_grid_relation
esua_epdc_user.epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
GROUP BY
USER_ID
) MINRELA
ON MINRELA.USER_ID = uu.ID
LEFT JOIN esua_epdc_user.epdc_user_grid_relation RELATION ON RELATION.USER_ID = MINRELA.USER_ID AND RELATION.DEL_FLAG = '0' AND MINRELA.CREATED_TIME = RELATION.CREATED_TIME
inner JOIN
AND AUTHENTICATED_TYPE IN ( '0', '1' )
<if test="operationEndTime != null and operationEndTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;=#{operationEndTime}
</if>
<if test="endTime != null and endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;=#{endTime}
</if>
AND USER_ID = uu.ID
ORDER BY
CREATED_TIME DESC,
id
LIMIT 1
) AS AUTHENTICATED_TYPE,
(
SELECT
ad.id,
ad.`name`,
ad.pid
AUTHENTICATED_FLAG
FROM
esua_epdc_admin.sys_dept ad
esua_epdc_user.epdc_user_authenticate_history
WHERE
ad.id IN <include refid="foreachAllDeptIdsShow"></include>
AND ad.del_flag = 0
) t0
ON find_in_set(t0.id, IFNULL(if(uu.ALL_DEPT_IDS = '',null,uu.ALL_DEPT_IDS),RELATION.ALL_DEPT_IDS))
LEFT JOIN (
SELECT MAX( CREATED_TIME ) AS CREATED_TIME, USER_ID
FROM esua_epdc_user.epdc_user_authenticate_history
WHERE DEL_FLAG = '0' AND AUTHENTICATED_TYPE IN ( '0', '1' )
DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
<if test="operationEndTime != null and operationEndTime != ''">
AND DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{operationEndTime}
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;=#{operationEndTime}
</if>
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
<if test="endTime != null and endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;=#{endTime}
</if>
GROUP BY USER_ID
) MAXHIS ON MAXHIS.USER_ID = uu.ID
LEFT JOIN esua_epdc_user.epdc_user_authenticate_history HISTORY ON HISTORY.USER_ID = MAXHIS.USER_ID AND HISTORY.CREATED_TIME = MAXHIS.CREATED_TIME AND HISTORY.DEL_FLAG = '0'
AND USER_ID = uu.ID
ORDER BY
CREATED_TIME DESC ,
id
LIMIT 1
) AS AUTHENTICATED_FLAG,
ifnull(if(uu.DEPT_ID = 0, NULL, uu.DEPT_ID), (
SELECT GRID_ID FROM esua_epdc_user.epdc_user_grid_relation
WHERE DEL_FLAG = '0' AND USER_ID = uu.ID
ORDER BY
CREATED_TIME,
id
LIMIT 1
)) AS DEPT_ID,
ifnull(if(uu.ALL_DEPT_IDS = '', NULL, uu.ALL_DEPT_IDS), (
SELECT ALL_DEPT_IDS FROM esua_epdc_user.epdc_user_grid_relation
WHERE DEL_FLAG = '0' AND USER_ID = uu.ID
ORDER BY
CREATED_TIME,
id
LIMIT 1
)) AS ALL_DEPT_IDS
FROM
esua_epdc_user.epdc_user uu
where uu.DEL_FLAG = '0'
AND IFNULL(if(uu.dept_id=0,null,uu.dept_id),RELATION.GRID_ID) IN
<foreach collection="deptIdList" index="index" item="deptId" open="(" separator="," close=")">
#{deptId}
</foreach>
<if test="operationStartTime != null and operationEndTime != null and operationEndTime != ''">
AND DATE_FORMAT(uu.CREATED_TIME,'%Y-%m-%d') BETWEEN #{operationStartTime} AND #{operationEndTime}
</if>
<if test="endTime != null and endTime != ''">
and DATE_FORMAT(uu.CREATED_TIME,'%Y-%m-%d') &lt;=#{endTime}
</if>
GROUP BY
t0.id
ORDER BY
t0.id ASC) tab
on tt.id = tab.id
ORDER BY
tt.id ASC
) user
inner JOIN
(
SELECT
ad.id,
ad.`name`,
ad.pid
FROM
esua_epdc_admin.sys_dept ad
WHERE
ad.id IN <include refid="foreachAllDeptIdsShow"></include>
AND ad.del_flag = 0
) t0 on find_in_set(t0.id, user.ALL_DEPT_IDS)
where user.dept_id IN
<foreach collection="deptIdList" index="index" item="deptId" open="(" separator="," close=")">
#{deptId}
</foreach>
GROUP BY t0.id
) tab on tt.id = tab.DEPT_ID
ORDER BY tt.id ASC
</select>
<select id="selectExportunAuthorizedCount" resultType="com.elink.esua.epdc.dto.user.result.ExportOperationDataResultDTO">
@ -963,38 +1014,66 @@
COUNT( (t.AUTHENTICATED_TYPE='1' and t.AUTHENTICATED_FLAG = '1') OR NULL ) partyMemberCount,
count((t.AUTHENTICATED_TYPE='1' and t.AUTHENTICATED_FLAG = '0' ) or null ) partyAuthFailureCount,
COUNT( (t.AUTHENTICATED_TYPE='1' and t.AUTHENTICATED_FLAG = '1' and t.age > 50) OR NULL ) oldCount,
COUNT( (t.AUTHENTICATED_TYPE='1' and t.AUTHENTICATED_FLAG = '1' and t.age &lt;= 50 AND t.age > 0 ) OR NULL ) youngCount
COUNT( (t.AUTHENTICATED_TYPE='1' and t.AUTHENTICATED_FLAG = '1' and t.age &lt;= 50 AND t.age > 0 ) OR NULL )
youngCount
FROM (
select newuu.userId,newuu.SEX,newuu.age,ad2.`name` streetName,
ad2.id streetId,newuu.AUTHENTICATED_TYPE,newuu.AUTHENTICATED_FLAG,newuu.DEPT_ID
from (
SELECT
uu.ID AS userId,
DISTINCT uu.ID userId,uu.CREATED_TIME,uu.DEL_FLAG,
CASE WHEN uu.SEX is null or uu.SEX != '0' AND uu.SEX != '1' THEN '2' ELSE uu.SEX END AS SEX,
uu.STATE, uu.PARTY_FLAG, uu.DEPT_ID,
IFNULL( TIMESTAMPDIFF( YEAR, uu.BIRTHDAY, CURDATE()), 0 ) age,
ad2.`name` streetName, ad2.id streetId,
HISTORY.AUTHENTICATED_TYPE,
HISTORY.AUTHENTICATED_FLAG
(
SELECT
AUTHENTICATED_TYPE
FROM
esua_epdc_user.epdc_user uu
LEFT JOIN (SELECT MIN( CREATED_TIME ) AS CREATED_TIME, USER_ID FROM esua_epdc_user.epdc_user_grid_relation WHERE DEL_FLAG = '0' GROUP BY USER_ID ) MINRELA ON MINRELA.USER_ID = uu.ID
LEFT JOIN esua_epdc_user.epdc_user_grid_relation RELATION ON RELATION.USER_ID = MINRELA.USER_ID AND RELATION.DEL_FLAG = '0' AND MINRELA.CREATED_TIME = RELATION.CREATED_TIME
LEFT JOIN esua_epdc_admin.sys_dept ad ON IFNULL(if(uu.DEPT_ID = 0,null,uu.DEPT_ID),RELATION.GRID_ID) = ad.ID AND ad.type_key = 'grid_party'
<include refid="joinCommunityStreet"></include>
LEFT JOIN (
SELECT MAX( CREATED_TIME ) AS CREATED_TIME, USER_ID
FROM esua_epdc_user.epdc_user_authenticate_history
WHERE DEL_FLAG = '0' AND AUTHENTICATED_TYPE IN ( '0', '1' )
epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
</if>
GROUP BY USER_ID
) MAXHIS ON MAXHIS.USER_ID = uu.ID
LEFT JOIN esua_epdc_user.epdc_user_authenticate_history HISTORY ON HISTORY.USER_ID = MAXHIS.USER_ID AND HISTORY.CREATED_TIME = MAXHIS.CREATED_TIME AND HISTORY.DEL_FLAG = '0'
AND USER_ID = uu.ID
ORDER BY
CREATED_TIME DESC,
id
LIMIT 1
) AS AUTHENTICATED_TYPE,
(
SELECT
AUTHENTICATED_FLAG
FROM
epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
</if>
AND USER_ID = uu.ID
ORDER BY
CREATED_TIME DESC ,
id
LIMIT 1
) AS AUTHENTICATED_FLAG,
ifnull(if(uu.DEPT_ID = 0, NULL, uu.DEPT_ID), (
SELECT GRID_ID FROM epdc_user_grid_relation
WHERE DEL_FLAG = '0' AND USER_ID = uu.ID
ORDER BY
CREATED_TIME,
id
LIMIT 1
)) AS DEPT_ID
FROM
epdc_user uu
) newuu
LEFT JOIN esua_epdc_admin.sys_dept ad ON newuu.DEPT_ID = ad.ID AND ad.type_key = 'grid_party'
<include refid="joinCommunityStreet"></include>
WHERE uu.DEL_FLAG = '0'
WHERE newuu.DEL_FLAG = '0'
<choose>
<when test="gridId != null and gridId != ''">AND ad2.ID = #{gridId}</when>
<otherwise>
@ -1005,12 +1084,11 @@
</otherwise>
</choose>
<if test="startTime != null and endTime != null and endTime != ''">
AND DATE_FORMAT(uu.CREATED_TIME,'%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
AND DATE_FORMAT(newuu.CREATED_TIME,'%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
</if>
AND ad2.id is NOT NULL
AND ad.id IS NOT NULL
) t GROUP BY t.streetId
) t1
<choose>
@ -1047,49 +1125,92 @@
COUNT( (t.AUTHENTICATED_TYPE!='1' or t.AUTHENTICATED_FLAG != '1' and t.age &lt;= 50 AND t.age > 0 ) OR NULL ) youngCount
FROM (
select
newuu.ID userId,
newuu.AUTHENTICATED_TYPE,
newuu.AUTHENTICATED_FLAG,
newuu.HistoryCount,
newuu.DEPT_ID,
newuu.SEX,
newuu.age,
ad2.`name` streetName,
ad2.id streetId
from
(
SELECT
uu.ID AS userId,
DISTINCT uu.ID,
uu.DEL_FLAG,
uu.CREATED_TIME,
CASE WHEN uu.SEX is null or uu.SEX != '0' AND uu.SEX != '1' THEN '2' ELSE uu.SEX END AS SEX,
uu.STATE, uu.PARTY_FLAG, uu.DEPT_ID,
IFNULL( TIMESTAMPDIFF( YEAR, uu.BIRTHDAY, CURDATE()), 0 ) age,
ad2.`name` streetName, ad2.id streetId,
HISTORY.AUTHENTICATED_TYPE,
HISTORY.AUTHENTICATED_FLAG,
HISCOUNT.HistoryCount
(
SELECT
AUTHENTICATED_TYPE
FROM
esua_epdc_user.epdc_user uu
LEFT JOIN (SELECT MIN( CREATED_TIME ) AS CREATED_TIME, USER_ID FROM esua_epdc_user.epdc_user_grid_relation WHERE DEL_FLAG = '0' GROUP BY USER_ID ) MINRELA ON MINRELA.USER_ID = uu.ID
LEFT JOIN esua_epdc_user.epdc_user_grid_relation RELATION ON RELATION.USER_ID = MINRELA.USER_ID AND RELATION.DEL_FLAG = '0' AND MINRELA.CREATED_TIME = RELATION.CREATED_TIME
LEFT JOIN esua_epdc_admin.sys_dept ad ON IFNULL(if(uu.DEPT_ID = 0,null,uu.DEPT_ID),RELATION.GRID_ID) = ad.ID AND ad.type_key = 'grid_party'
<include refid="joinCommunityStreet"></include>
LEFT JOIN (
SELECT MAX( CREATED_TIME ) AS CREATED_TIME, USER_ID
FROM esua_epdc_user.epdc_user_authenticate_history
WHERE DEL_FLAG = '0' AND AUTHENTICATED_TYPE IN ( '0', '1' )
epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
</if>
GROUP BY USER_ID
) MAXHIS ON MAXHIS.USER_ID = uu.ID
LEFT JOIN esua_epdc_user.epdc_user_authenticate_history HISTORY ON HISTORY.USER_ID = MAXHIS.USER_ID AND HISTORY.CREATED_TIME = MAXHIS.CREATED_TIME AND HISTORY.DEL_FLAG = '0'
LEFT JOIN (
AND USER_ID = uu.ID
ORDER BY
CREATED_TIME DESC,
id
LIMIT 1
) AS AUTHENTICATED_TYPE,
(
SELECT
count(id) AS HistoryCount,
USER_ID
AUTHENTICATED_FLAG
FROM
esua_epdc_user.epdc_user_authenticate_history
epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
AND AUTHENTICATED_FLAG= '1'
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
</if>
GROUP BY USER_ID
) HISCOUNT ON HISCOUNT.USER_ID = uu.ID
WHERE uu.DEL_FLAG = '0'
AND USER_ID = uu.ID
ORDER BY
CREATED_TIME DESC ,
id
LIMIT 1
) AS AUTHENTICATED_FLAG,
(
SELECT
count( id ) AS HistoryCount
FROM
epdc_user_authenticate_history
WHERE
DEL_FLAG = '0'
AND AUTHENTICATED_TYPE IN ( '0', '1' )
AND AUTHENTICATED_FLAG = '1'
<if test="endTime != ''">
and DATE_FORMAT(CREATED_TIME,'%Y-%m-%d') &lt;= #{endTime}
</if>
AND USER_ID = uu.ID
) AS HistoryCount,
ifnull(if(uu.DEPT_ID = 0, NULL, uu.DEPT_ID), (
SELECT GRID_ID FROM epdc_user_grid_relation
WHERE DEL_FLAG = '0' AND USER_ID = uu.ID
ORDER BY
CREATED_TIME,
id
LIMIT 1
)) AS DEPT_ID
FROM
epdc_user uu
) newuu
LEFT JOIN esua_epdc_admin.sys_dept ad ON newuu.DEPT_ID = ad.ID AND ad.type_key = 'grid_party'
<include refid="joinCommunityStreet"></include>
where
newuu.DEL_FLAG = '0'
<if test="startTime != null and endTime != null and endTime != ''">
AND DATE_FORMAT(newuu.CREATED_TIME,'%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
</if>
AND ad2.id is NOT NULL
AND ad.id IS NOT NULL
<choose>
<when test="gridId != null and gridId != ''">AND ad2.ID = #{gridId}</when>
<otherwise>
@ -1099,12 +1220,6 @@
</if>
</otherwise>
</choose>
<if test="startTime != null and endTime != null and endTime != ''">
AND DATE_FORMAT(uu.CREATED_TIME,'%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
</if>
AND ad2.id is NOT NULL
AND ad.id IS NOT NULL
) t GROUP BY t.streetId
) t1

Loading…
Cancel
Save