perf: 复购率视图也转物化视图,健康分API加速到0.3秒
This commit is contained in:
@@ -217,7 +217,7 @@ router.get('/member/comparison', async (req: AuthRequest, res) => {
|
|||||||
|
|
||||||
router.get('/member/repeat', async (req: AuthRequest, res) => {
|
router.get('/member/repeat', async (req: AuthRequest, res) => {
|
||||||
try {
|
try {
|
||||||
const result = await query(`SELECT * FROM analytics.v_store_repeat_summary_monthly ORDER BY repeat_rate_pct DESC NULLS LAST`)
|
const result = await query(`SELECT * FROM analytics.mv_store_repeat_summary_monthly ORDER BY repeat_rate_pct DESC NULLS LAST`)
|
||||||
sendSuccess(res, result.rows)
|
sendSuccess(res, result.rows)
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
sendError(res, err.message)
|
sendError(res, err.message)
|
||||||
@@ -428,7 +428,7 @@ router.get('/stores/:code/member', async (req: AuthRequest, res) => {
|
|||||||
try {
|
try {
|
||||||
const [oppResult, repeatResult, monthlyResult] = await Promise.all([
|
const [oppResult, repeatResult, monthlyResult] = await Promise.all([
|
||||||
query(`SELECT * FROM analytics.v_store_member_opportunity WHERE store_code = $1`, [req.params.code]),
|
query(`SELECT * FROM analytics.v_store_member_opportunity WHERE store_code = $1`, [req.params.code]),
|
||||||
query(`SELECT * FROM analytics.v_store_repeat_summary_monthly WHERE store_code = $1`, [req.params.code]),
|
query(`SELECT * FROM analytics.mv_store_repeat_summary_monthly WHERE store_code = $1`, [req.params.code]),
|
||||||
query(`
|
query(`
|
||||||
SELECT store_code, store_name, count(*) as member_count,
|
SELECT store_code, store_name, count(*) as member_count,
|
||||||
sum(orders) as total_orders, sum(received) as total_received,
|
sum(orders) as total_orders, sum(received) as total_received,
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ router.get('/health-score', async (req: AuthRequest, res) => {
|
|||||||
),
|
),
|
||||||
member AS (
|
member AS (
|
||||||
SELECT store_code, max(repeat_rate_pct) AS repeat_rate_pct
|
SELECT store_code, max(repeat_rate_pct) AS repeat_rate_pct
|
||||||
FROM analytics.v_store_repeat_summary_monthly
|
FROM analytics.mv_store_repeat_summary_monthly
|
||||||
GROUP BY store_code
|
GROUP BY store_code
|
||||||
),
|
),
|
||||||
task AS (
|
task AS (
|
||||||
@@ -325,7 +325,7 @@ router.get('/correlation', async (req: AuthRequest, res) => {
|
|||||||
FROM analytics.v_store_platform_economics pe
|
FROM analytics.v_store_platform_economics pe
|
||||||
JOIN analytics.mv_store_risk_rating r2 ON pe.store_code = r2.store_code
|
JOIN analytics.mv_store_risk_rating r2 ON pe.store_code = r2.store_code
|
||||||
) p ON r.store_code = p.store_code
|
) p ON r.store_code = p.store_code
|
||||||
LEFT JOIN analytics.v_store_repeat_summary_monthly m ON r.store_code = m.store_code
|
LEFT JOIN analytics.mv_store_repeat_summary_monthly m ON r.store_code = m.store_code
|
||||||
WHERE r.received IS NOT NULL
|
WHERE r.received IS NOT NULL
|
||||||
ORDER BY
|
ORDER BY
|
||||||
CASE WHEN COALESCE(p.platform_share, 0) > 40 AND COALESCE(r.member_bill_share_pct, 0) < 20 THEN 0 ELSE 1 END,
|
CASE WHEN COALESCE(p.platform_share, 0) > 40 AND COALESCE(r.member_bill_share_pct, 0) < 20 THEN 0 ELSE 1 END,
|
||||||
|
|||||||
Reference in New Issue
Block a user