226 lines
6.9 KiB
SQL
226 lines
6.9 KiB
SQL
-- ============================================
|
||
-- 数据分析实时大屏 - 测试查询脚本
|
||
-- ============================================
|
||
-- 这些查询用于验证实时大屏的数据计算逻辑
|
||
|
||
-- ============================================
|
||
-- 1. 测试实时GMV查询
|
||
-- ============================================
|
||
-- 今日GMV
|
||
SELECT
|
||
SUM(total_amount) as today_gmv,
|
||
COUNT(*) as today_order_count
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
AND status = 2;
|
||
|
||
-- 昨日同时段GMV(当前时间往前推24小时)
|
||
SELECT
|
||
SUM(total_amount) as yesterday_gmv,
|
||
COUNT(*) as yesterday_order_count
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW() - INTERVAL '1 day')
|
||
AND created_at <= NOW() - INTERVAL '1 day'
|
||
AND status = 2;
|
||
|
||
-- GMV增长率计算
|
||
WITH today_stats AS (
|
||
SELECT
|
||
COALESCE(SUM(total_amount), 0) as gmv,
|
||
COUNT(*) as orders
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
AND status = 2
|
||
),
|
||
yesterday_stats AS (
|
||
SELECT
|
||
COALESCE(SUM(total_amount), 0) as gmv,
|
||
COUNT(*) as orders
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW() - INTERVAL '1 day')
|
||
AND created_at <= NOW() - INTERVAL '1 day'
|
||
AND status = 2
|
||
)
|
||
SELECT
|
||
today_stats.gmv as today_gmv,
|
||
yesterday_stats.gmv as yesterday_gmv,
|
||
CASE
|
||
WHEN yesterday_stats.gmv > 0 THEN
|
||
ROUND((today_stats.gmv - yesterday_stats.gmv) / yesterday_stats.gmv * 100, 2)
|
||
ELSE
|
||
CASE WHEN today_stats.gmv > 0 THEN 100 ELSE 0 END
|
||
END as gmv_growth_percent,
|
||
today_stats.orders as today_orders,
|
||
yesterday_stats.orders as yesterday_orders,
|
||
CASE
|
||
WHEN yesterday_stats.orders > 0 THEN
|
||
ROUND((today_stats.orders - yesterday_stats.orders)::numeric / yesterday_stats.orders * 100, 2)
|
||
ELSE
|
||
CASE WHEN today_stats.orders > 0 THEN 100 ELSE 0 END
|
||
END as order_growth_percent
|
||
FROM today_stats, yesterday_stats;
|
||
|
||
-- ============================================
|
||
-- 2. 测试在线用户查询
|
||
-- ============================================
|
||
-- 最近5分钟内有活动的用户(在线用户)
|
||
SELECT COUNT(DISTINCT user_id) as online_users
|
||
FROM user_sessions
|
||
WHERE last_active_at >= NOW() - INTERVAL '5 minutes'
|
||
AND is_active = true;
|
||
|
||
-- 备用方案:从用户表查询最近5分钟登录的用户
|
||
SELECT COUNT(*) as online_users_from_users
|
||
FROM users
|
||
WHERE last_login_at >= NOW() - INTERVAL '5 minutes';
|
||
|
||
-- ============================================
|
||
-- 3. 测试转化率查询
|
||
-- ============================================
|
||
-- 今日下单的唯一用户数
|
||
SELECT COUNT(DISTINCT user_id) as unique_order_users
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
AND status = 2;
|
||
|
||
-- 今日访问用户数(从用户会话表)
|
||
SELECT COUNT(DISTINCT user_id) as today_visitors
|
||
FROM user_sessions
|
||
WHERE created_at >= DATE_TRUNC('day', NOW());
|
||
|
||
-- 转化率计算
|
||
WITH order_users AS (
|
||
SELECT COUNT(DISTINCT user_id) as count
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
AND status = 2
|
||
),
|
||
visitors AS (
|
||
SELECT COUNT(DISTINCT user_id) as count
|
||
FROM user_sessions
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
)
|
||
SELECT
|
||
order_users.count as order_users,
|
||
visitors.count as visitors,
|
||
CASE
|
||
WHEN visitors.count > 0 THEN
|
||
ROUND(order_users.count::numeric / visitors.count * 100, 2)
|
||
ELSE 0
|
||
END as conversion_rate_percent
|
||
FROM order_users, visitors;
|
||
|
||
-- ============================================
|
||
-- 4. 综合实时大屏数据查询
|
||
-- ============================================
|
||
WITH
|
||
-- 今日统计
|
||
today_stats AS (
|
||
SELECT
|
||
COALESCE(SUM(total_amount), 0) as gmv,
|
||
COUNT(*) as orders,
|
||
COUNT(DISTINCT user_id) as order_users
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
AND status = 2
|
||
),
|
||
-- 昨日同时段统计
|
||
yesterday_stats AS (
|
||
SELECT
|
||
COALESCE(SUM(total_amount), 0) as gmv,
|
||
COUNT(*) as orders,
|
||
COUNT(DISTINCT user_id) as order_users
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW() - INTERVAL '1 day')
|
||
AND created_at <= NOW() - INTERVAL '1 day'
|
||
AND status = 2
|
||
),
|
||
-- 在线用户
|
||
online_users AS (
|
||
SELECT COUNT(DISTINCT user_id) as count
|
||
FROM user_sessions
|
||
WHERE last_active_at >= NOW() - INTERVAL '5 minutes'
|
||
AND is_active = true
|
||
),
|
||
-- 今日访问用户
|
||
today_visitors AS (
|
||
SELECT COUNT(DISTINCT user_id) as count
|
||
FROM user_sessions
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
),
|
||
-- 昨日同时段访问用户
|
||
yesterday_visitors AS (
|
||
SELECT COUNT(DISTINCT user_id) as count
|
||
FROM user_sessions
|
||
WHERE created_at >= DATE_TRUNC('day', NOW() - INTERVAL '1 day')
|
||
AND created_at <= NOW() - INTERVAL '1 day'
|
||
)
|
||
SELECT
|
||
-- GMV数据
|
||
today_stats.gmv as real_time_gmv,
|
||
CASE
|
||
WHEN yesterday_stats.gmv > 0 THEN
|
||
ROUND((today_stats.gmv - yesterday_stats.gmv) / yesterday_stats.gmv * 100, 1)
|
||
ELSE
|
||
CASE WHEN today_stats.gmv > 0 THEN 100.0 ELSE 0.0 END
|
||
END as gmv_growth,
|
||
|
||
-- 订单数据
|
||
today_stats.orders as real_time_orders,
|
||
CASE
|
||
WHEN yesterday_stats.orders > 0 THEN
|
||
ROUND((today_stats.orders - yesterday_stats.orders)::numeric / yesterday_stats.orders * 100, 1)
|
||
ELSE
|
||
CASE WHEN today_stats.orders > 0 THEN 100.0 ELSE 0.0 END
|
||
END as order_growth,
|
||
|
||
-- 在线用户
|
||
COALESCE(online_users.count, 0) as online_users,
|
||
|
||
-- 转化率
|
||
CASE
|
||
WHEN today_visitors.count > 0 THEN
|
||
ROUND(today_stats.order_users::numeric / today_visitors.count * 100, 1)
|
||
ELSE 0
|
||
END as conversion_rate,
|
||
CASE
|
||
WHEN yesterday_visitors.count > 0 AND yesterday_stats.order_users > 0 THEN
|
||
ROUND((today_stats.order_users::numeric / today_visitors.count * 100) -
|
||
(yesterday_stats.order_users::numeric / yesterday_visitors.count * 100), 1)
|
||
ELSE 0
|
||
END as conversion_growth
|
||
FROM today_stats, yesterday_stats, online_users, today_visitors, yesterday_visitors;
|
||
|
||
-- ============================================
|
||
-- 5. 数据验证查询
|
||
-- ============================================
|
||
-- 检查今日订单数据
|
||
SELECT
|
||
DATE_TRUNC('hour', created_at) as hour,
|
||
COUNT(*) as order_count,
|
||
SUM(total_amount) as hour_gmv
|
||
FROM orders
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
AND status = 2
|
||
GROUP BY DATE_TRUNC('hour', created_at)
|
||
ORDER BY hour DESC;
|
||
|
||
-- 检查用户会话数据
|
||
SELECT
|
||
DATE_TRUNC('hour', created_at) as hour,
|
||
COUNT(DISTINCT user_id) as unique_visitors
|
||
FROM user_sessions
|
||
WHERE created_at >= DATE_TRUNC('day', NOW())
|
||
GROUP BY DATE_TRUNC('hour', created_at)
|
||
ORDER BY hour DESC;
|
||
|
||
-- 检查最近活动的用户
|
||
SELECT
|
||
user_id,
|
||
last_active_at,
|
||
NOW() - last_active_at as time_ago
|
||
FROM user_sessions
|
||
WHERE last_active_at >= NOW() - INTERVAL '10 minutes'
|
||
AND is_active = true
|
||
ORDER BY last_active_at DESC;
|