1、历史汇总查询优化,改用老接口,优化了sql;

This commit is contained in:
chenlin 2024-12-16 14:38:00 +08:00
parent 1b2dbab38d
commit cb6b269185
2 changed files with 177 additions and 67 deletions

View File

@ -428,39 +428,81 @@ func (e MiGuDeployService) HistoricalSummaryListOld(c *gin.Context) {
// Group("DATE(mg_order.subscribe_time), mg_order.product_id, mg_order.channel_code").
// Order("mg_order.product_id, mg_order.channel_code, mg_order.subscribe_time")
//qs := e.Orm.Model(&models.MgOrder{}).
// Select(`DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date,
// mg_order.product_id,
// mg_order.channel_code,
// (SELECT COUNT(*)
// FROM mg_transaction_log
// WHERE verification_code != ''
// AND channel_code = mg_order.channel_code
// AND DATE(created_at) = DATE(mg_order.subscribe_time)) AS submission_count,
// COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour,
// COUNT(CASE WHEN mg_order.state = 2 AND mg_order.unsubscribe_time >= ? AND mg_order.unsubscribe_time <= ? THEN 1 END) AS new_user_unsub_on_day,
// COUNT(*) AS new_user_count,
// CONCAT(ROUND(COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) * 100.0 /
// NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_within_hour_rate,
// CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 AND mg_order.unsubscribe_time >= ? AND mg_order.unsubscribe_time <= ? THEN 1 END) * 100.0 /
// NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate,
// IFNULL(
// CONCAT(
// LEAST(
// ROUND(COUNT(*) * 100.0 / NULLIF(
// (SELECT COUNT(*)
// FROM mg_transaction_log
// WHERE verification_code != ''
// AND channel_code = mg_order.channel_code
// AND DATE(created_at) = DATE(mg_order.subscribe_time)), 0), 2),
// 100.00
// ),
// '%'
// ),
// '0.00%'
// ) AS submission_success_rate`,
// startTime, endTime, startTime, endTime).
// Where("mg_order.subscribe_time >= ? AND mg_order.subscribe_time <= ?", startTime, endTime).
// Group("DATE(mg_order.subscribe_time), mg_order.product_id, mg_order.channel_code").
// Order("mg_order.product_id, mg_order.channel_code, mg_order.subscribe_time DESC")
qs := e.Orm.Model(&models.MgOrder{}).
Select(`DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date,
Select(`
DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date,
mg_order.product_id,
mg_order.channel_code,
(SELECT COUNT(*)
FROM mg_transaction_log
WHERE verification_code != ''
AND channel_code = mg_order.channel_code
AND DATE(created_at) = DATE(mg_order.subscribe_time)) AS submission_count,
IFNULL(submission_count.submission_count, 0) AS submission_count,
COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour,
COUNT(CASE WHEN mg_order.state = 2 AND mg_order.unsubscribe_time >= ? AND mg_order.unsubscribe_time <= ? THEN 1 END) AS new_user_unsub_on_day,
COUNT(CASE WHEN mg_order.state = 2 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) AS new_user_unsub_on_day,
COUNT(*) AS new_user_count,
CONCAT(ROUND(COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) * 100.0 /
NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_within_hour_rate,
CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 AND mg_order.unsubscribe_time >= ? AND mg_order.unsubscribe_time <= ? THEN 1 END) * 100.0 /
NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate,
SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) AS total_new_user_unsub,
CONCAT(ROUND(COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_within_hour_rate,
CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate,
CONCAT(ROUND(SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS total_new_user_unsub_rate,
IFNULL(
CONCAT(
LEAST(
ROUND(COUNT(*) * 100.0 / NULLIF(
(SELECT COUNT(*)
FROM mg_transaction_log
WHERE verification_code != ''
AND channel_code = mg_order.channel_code
AND DATE(created_at) = DATE(mg_order.subscribe_time)), 0), 2),
ROUND(COUNT(*) * 100.0 / NULLIF(submission_count.submission_count, 0), 2),
100.00
),
'%'
),
'0.00%'
) AS submission_success_rate`,
startTime, endTime, startTime, endTime).
Where("mg_order.subscribe_time >= ? AND mg_order.subscribe_time <= ?", startTime, endTime).
) AS submission_success_rate
`).
// 使用 Joins 来替代 LeftJoin 进行左连接
Joins(`
LEFT JOIN (
SELECT
channel_code,
DATE(created_at) AS created_date,
COUNT(*) AS submission_count
FROM mg_transaction_log
WHERE verification_code != ''
GROUP BY channel_code, created_date
) AS submission_count
ON submission_count.channel_code = mg_order.channel_code
AND submission_count.created_date = DATE(mg_order.subscribe_time)
`).
Where("mg_order.subscribe_time BETWEEN ? AND ?", startTime, endTime).
Group("DATE(mg_order.subscribe_time), mg_order.product_id, mg_order.channel_code").
Order("mg_order.product_id, mg_order.channel_code, mg_order.subscribe_time DESC")
@ -797,6 +839,68 @@ func (e MiGuDeployService) processTimeRange(startTime, endTime, minDate, maxDate
// return data, nil
//}
//// 查询历史数据
//func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req *models.HistoricalSummaryListReq) ([]models.MgHistoricalSummary, error) {
// qs := e.Orm.Model(&models.MgOrder{}).
// Select(`
// DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date,
// mg_order.product_id,
// mg_order.channel_code,
// (
// SELECT COUNT(*)
// FROM mg_transaction_log
// WHERE verification_code != ''
// AND channel_code = mg_order.channel_code
// AND DATE(created_at) = DATE(mg_order.subscribe_time)
// ) AS submission_count,
// COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour,
// COUNT(CASE WHEN mg_order.state = 2 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) AS new_user_unsub_on_day,
// COUNT(*) AS new_user_count,
// SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) AS total_new_user_unsub,
// CONCAT(ROUND(COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_within_hour_rate,
// CONCAT(ROUND(COUNT(CASE WHEN mg_order.state = 2 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS new_user_unsub_on_day_rate,
// CONCAT(ROUND(SUM(CASE WHEN mg_order.state = 2 THEN 1 ELSE 0 END) * 100.0 / NULLIF(COUNT(*), 0), 2), '%') AS total_new_user_unsub_rate,
// IFNULL(
// CONCAT(
// LEAST(
// ROUND(COUNT(*) * 100.0 / NULLIF(
// (SELECT COUNT(*)
// FROM mg_transaction_log
// WHERE verification_code != ''
// AND channel_code = mg_order.channel_code
// AND DATE(created_at) = DATE(mg_order.subscribe_time)), 0), 2),
// 100.00
// ),
// '%'
// ),
// '0.00%'
// ) AS submission_success_rate
// `).
// Where("mg_order.subscribe_time BETWEEN ? AND ?", startTime, endTime).
// Group("DATE(mg_order.subscribe_time), mg_order.product_id, mg_order.channel_code").
// Order("mg_order.product_id, mg_order.channel_code, mg_order.subscribe_time DESC")
//
// if req.SkuCode != 0 {
// qs = qs.Where("product_id = ?", req.SkuCode)
// }
// if req.Channel != "" {
// qs = qs.Where("channel_code = ?", req.Channel)
// }
//
// var data []models.MgHistoricalSummary
// var err error
// if req.IsExport == 1 {
// err = qs.Find(&data).Error
// } else {
// err = qs.Limit(req.PageSize).Find(&data).Error
// }
// if err != nil {
// return nil, err
// }
//
// return data, nil
//}
// 查询历史数据
func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req *models.HistoricalSummaryListReq) ([]models.MgHistoricalSummary, error) {
qs := e.Orm.Model(&models.MgOrder{}).
@ -804,13 +908,7 @@ func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req
DATE_FORMAT(mg_order.subscribe_time, '%Y-%m-%d') AS date,
mg_order.product_id,
mg_order.channel_code,
(
SELECT COUNT(*)
FROM mg_transaction_log
WHERE verification_code != ''
AND channel_code = mg_order.channel_code
AND DATE(created_at) = DATE(mg_order.subscribe_time)
) AS submission_count,
IFNULL(submission_count.submission_count, 0) AS submission_count,
COUNT(CASE WHEN mg_order.is_one_hour_cancel = 1 THEN 1 END) AS new_user_unsub_within_hour,
COUNT(CASE WHEN mg_order.state = 2 AND DATE(mg_order.unsubscribe_time) = DATE(mg_order.subscribe_time) THEN 1 END) AS new_user_unsub_on_day,
COUNT(*) AS new_user_count,
@ -821,12 +919,7 @@ func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req
IFNULL(
CONCAT(
LEAST(
ROUND(COUNT(*) * 100.0 / NULLIF(
(SELECT COUNT(*)
FROM mg_transaction_log
WHERE verification_code != ''
AND channel_code = mg_order.channel_code
AND DATE(created_at) = DATE(mg_order.subscribe_time)), 0), 2),
ROUND(COUNT(*) * 100.0 / NULLIF(submission_count.submission_count, 0), 2),
100.00
),
'%'
@ -834,22 +927,39 @@ func (e MiGuDeployService) queryHistoricalSummary(startTime, endTime string, req
'0.00%'
) AS submission_success_rate
`).
// 使用 Joins 来替代 LeftJoin 进行左连接
Joins(`
LEFT JOIN (
SELECT
channel_code,
DATE(created_at) AS created_date,
COUNT(*) AS submission_count
FROM mg_transaction_log
WHERE verification_code != ''
GROUP BY channel_code, created_date
) AS submission_count
ON submission_count.channel_code = mg_order.channel_code
AND submission_count.created_date = DATE(mg_order.subscribe_time)
`).
Where("mg_order.subscribe_time BETWEEN ? AND ?", startTime, endTime).
Group("DATE(mg_order.subscribe_time), mg_order.product_id, mg_order.channel_code").
Order("mg_order.product_id, mg_order.channel_code, mg_order.subscribe_time DESC")
// 根据请求条件过滤
if req.SkuCode != 0 {
qs = qs.Where("product_id = ?", req.SkuCode)
qs = qs.Where("mg_order.product_id = ?", req.SkuCode)
}
if req.Channel != "" {
qs = qs.Where("channel_code = ?", req.Channel)
qs = qs.Where("mg_order.channel_code = ?", req.Channel)
}
var data []models.MgHistoricalSummary
var err error
if req.IsExport == 1 {
// 导出数据不限制分页
err = qs.Find(&data).Error
} else {
// 非导出时进行分页查询
err = qs.Limit(req.PageSize).Find(&data).Error
}
if err != nil {
@ -2683,7 +2793,7 @@ func (e MiGuDeployService) queryHistoricalDataByHour(startTime, endTime string,
// 如果转换失败,按原样比较;否则按数字顺序排序
if errI != nil && errJ != nil {
return filteredData[i].Hour < filteredData[j].Hour
return filteredData[i].Hour > filteredData[j].Hour
}
if errI != nil {
// 如果 i 的 hour 无法转换为数字,则认为它大于 j
@ -2693,7 +2803,7 @@ func (e MiGuDeployService) queryHistoricalDataByHour(startTime, endTime string,
// 如果 j 的 hour 无法转换为数字,则认为它大于 i
return true
}
return hourI < hourJ
return hourI > hourJ
})
// 如果是导出数据,直接返回所有数据

View File

@ -23,7 +23,7 @@ func registerMiGuControlManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi
api.POST("transaction/list", apiMiGu.TransactionList) // 查询交易流水记录
api.POST("order/list", apiMiGu.OrderList) // 查询订单列表
api.POST("historical_summary/list", apiMiGu.HistoricalSummaryListNew) // 历史汇总查询
//api.POST("historical_summary/list", apiMiGu.HistoricalSummaryListNew) // 历史汇总查询
api.POST("hour_summary/list", apiMiGu.HourSummaryList) // 历史汇总查询(按小时)
api.POST("realtime_summary/list", apiMiGu.RealtimeSummaryList) // 当日实时汇总
api.POST("user_retention/list", apiMiGu.UserRetentionList) // 用户留存记录
@ -32,7 +32,7 @@ func registerMiGuControlManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi
api.POST("home/data", apiMiGu.HomepageDataSummary) // 查询首页汇总数据
api.POST("home/revenue_analysis", apiMiGu.CalculateRevenueAnalysis) // 查询不同日期的留存月份
//api.POST("historical_summary/list_old", apiMiGu.HistoricalSummaryListOld) // 历史汇总查询
api.POST("historical_summary/list", apiMiGu.HistoricalSummaryListOld) // 历史汇总查询
//api.POST("order/import", apiMiGu.ImportExcelToMgOrderHandler) // 通过excel导入订单数据
//api.POST("order/import_update", apiMiGu.ImportExcelToMgOrderHandlerUpdate) // 通过excel导入订单退订数据
}