不展示全部SQL,只展示拆解后的关键部分的最简模板

ROW_NUMBER
WITH
-- 原始数据
t AS (
SELECT 'u1' AS uid,'佛山' AS address,'2022-01-01' AS order_date UNION ALL
SELECT 'u2' AS uid,'深圳' AS address,'2022-01-02' AS order_date UNION ALL
SELECT 'u2' AS uid,'广州' AS address,'2022-01-03' AS order_date UNION ALL
SELECT 'u3' AS uid,'佛山' AS address,'2022-01-04' AS order_date
),
-- 开窗:按用户ID分区,分区内按日期降序
t1 AS (
SELECT
uid
,address
,order_date
,ROW_NUMBER() OVER(PARTITION BY uid ORDER BY order_date desc) AS a_row_number
FROM t
)
-- 过滤
SELECT
uid
,address AS last_address
,order_date AS last_order_date
FROM t1
WHERE a_row_number=1;
全外联
WITH
t1 AS (
SELECT 'u1' AS uid,10 AS amount UNION ALL
SELECT 'u2' AS uid,20 AS amount
),
t2 AS (
SELECT 'u2' AS uid,30 AS amount UNION ALL
SELECT 'u3' AS uid,40 AS amount
)
SELECT
NVL(t1.uid,t2.uid) AS uid,
NVL(t1.amount,0)+NVL(t2.amount,0) AS amount
FROM t1
FULL OUTER JOIN t2 ON t1.uid=t2.uid;
常见指标有:最近1、3、7、30天的下单数、退单数、下单金额、退单金额…
-- 日期筛选
WITH a AS (
SELECT '2022-08-01' AS y UNION ALL
SELECT '2022-08-02' AS y UNION ALL
SELECT '2022-08-03' AS y UNION ALL
SELECT '2022-08-04' AS y UNION ALL
SELECT '2022-08-05' AS y UNION ALL
SELECT '2022-08-06' AS y UNION ALL
SELECT '2022-08-07' AS y UNION ALL
SELECT '2022-08-08' AS y
)
SELECT y FROM a
WHERE y>DATE_SUB('2022-08-07',7) AND y<='2022-08-07'
ORDER BY y;
-- 查询结果:2022-08-01~2022-08-07
-- 按今天算,最近7天
WHERE y>DATE_SUB(CURRENT_DATE(),7) AND y<=CURRENT_DATE()
-- 按昨天算,最近7天
WHERE y>=DATE_SUB(CURRENT_DATE(),7) AND y<CURRENT_DATE()
-- 脚本中
SELECT
uid,
COUNT(IF(y="{ymd}",order_id,NULL)), -- 近1天下单数`,
COUNT(IF(y>DATE_SUB("{ymd}",7),order_id,NULL)), -- 近7天下单数`,
COUNT(order_id) -- 近30天下单数`
FROM dwd_order_i
WHERE y>DATE_SUB("{ymd}",30) AND y<="{ymd}"
GROUP BY uid;
少吃零食多看书