190 lines
5.7 KiB
SQL
190 lines
5.7 KiB
SQL
-- =====================================================================
|
||
-- @Name: DORIS-D-SQL-{表名}-QUERY
|
||
-- @Version: 1.0
|
||
-- @Desc: Apache Doris 查询模板
|
||
-- @TargetDatabase: Apache Doris
|
||
-- =====================================================================
|
||
|
||
-- ============================================================================
|
||
-- 1. 单表查询
|
||
-- ============================================================================
|
||
|
||
SELECT
|
||
order_id,
|
||
user_name,
|
||
total_amount,
|
||
create_time
|
||
FROM db_name.orders
|
||
WHERE order_date = '${day_id}'
|
||
AND status = 'completed'
|
||
ORDER BY total_amount DESC
|
||
LIMIT 100;
|
||
|
||
-- ============================================================================
|
||
-- 2. JOIN 查询
|
||
-- ============================================================================
|
||
|
||
-- 两表 JOIN
|
||
SELECT
|
||
o.order_id,
|
||
o.total_amount,
|
||
u.user_name,
|
||
u.vip_level
|
||
FROM db_name.orders o
|
||
JOIN db_name.users u ON o.user_id = u.user_id
|
||
WHERE o.order_date = '${day_id}'
|
||
AND o.status = 'completed';
|
||
|
||
-- 多表 JOIN
|
||
SELECT
|
||
o.order_id,
|
||
u.user_name,
|
||
p.product_name,
|
||
oi.quantity,
|
||
oi.unit_price
|
||
FROM db_name.orders o
|
||
JOIN db_name.users u ON o.user_id = u.user_id
|
||
JOIN db_name.order_items oi ON o.order_id = oi.order_id
|
||
JOIN db_name.products p ON oi.product_id = p.product_id
|
||
WHERE o.order_date BETWEEN '${start_date}' AND '${end_date}';
|
||
|
||
-- ============================================================================
|
||
-- 3. 聚合查询
|
||
-- ============================================================================
|
||
|
||
-- GROUP BY + HAVING
|
||
SELECT
|
||
department,
|
||
COUNT(*) AS order_count,
|
||
SUM(total_amount) AS total_amount,
|
||
AVG(total_amount) AS avg_amount
|
||
FROM db_name.orders
|
||
WHERE order_date = '${day_id}'
|
||
GROUP BY department
|
||
HAVING COUNT(*) >= 5
|
||
ORDER BY total_amount DESC;
|
||
|
||
-- 多字段分组 + 去重计数
|
||
SELECT
|
||
order_date,
|
||
region,
|
||
COUNT(*) AS order_count,
|
||
COUNT(DISTINCT user_id) AS unique_users,
|
||
SUM(total_amount) AS total_amount
|
||
FROM db_name.orders
|
||
WHERE order_date BETWEEN '${start_date}' AND '${end_date}'
|
||
GROUP BY order_date, region;
|
||
|
||
-- ============================================================================
|
||
-- 4. 窗口函数
|
||
-- ============================================================================
|
||
|
||
-- ROW_NUMBER(分组取Top N)
|
||
SELECT *
|
||
FROM (
|
||
SELECT
|
||
department,
|
||
user_name,
|
||
total_amount,
|
||
ROW_NUMBER() OVER (PARTITION BY department ORDER BY total_amount DESC) AS rn
|
||
FROM db_name.orders
|
||
WHERE order_date = '${day_id}'
|
||
) t
|
||
WHERE rn <= 3;
|
||
|
||
-- 累计聚合
|
||
SELECT
|
||
order_date,
|
||
daily_amount,
|
||
SUM(daily_amount) OVER (ORDER BY order_date) AS cumulative_amount,
|
||
AVG(daily_amount) OVER (
|
||
ORDER BY order_date
|
||
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
|
||
) AS moving_avg_7d
|
||
FROM (
|
||
SELECT order_date, SUM(total_amount) AS daily_amount
|
||
FROM db_name.orders
|
||
GROUP BY order_date
|
||
) t;
|
||
|
||
-- LAG/LEAD(环比计算)
|
||
SELECT
|
||
order_date,
|
||
daily_amount,
|
||
LAG(daily_amount, 1) OVER (ORDER BY order_date) AS prev_amount,
|
||
daily_amount - LAG(daily_amount, 1) OVER (ORDER BY order_date) AS daily_change,
|
||
ROUND(
|
||
(daily_amount - LAG(daily_amount, 1) OVER (ORDER BY order_date))
|
||
/ LAG(daily_amount, 1) OVER (ORDER BY order_date) * 100, 2
|
||
) AS growth_rate_pct
|
||
FROM (
|
||
SELECT order_date, SUM(total_amount) AS daily_amount
|
||
FROM db_name.orders
|
||
GROUP BY order_date
|
||
) t;
|
||
|
||
-- ============================================================================
|
||
-- 5. 分页查询
|
||
-- ============================================================================
|
||
|
||
-- LIMIT OFFSET 分页(Doris 原生支持)
|
||
SELECT
|
||
order_id, user_name, total_amount
|
||
FROM db_name.orders
|
||
WHERE order_date = '${day_id}'
|
||
ORDER BY order_id
|
||
LIMIT 20 OFFSET 0; -- 第1页,每页20条
|
||
|
||
-- ============================================================================
|
||
-- 6. 子查询
|
||
-- ============================================================================
|
||
|
||
-- IN 子查询
|
||
SELECT *
|
||
FROM db_name.orders
|
||
WHERE user_id IN (
|
||
SELECT user_id FROM db_name.users WHERE vip_level >= 3
|
||
)
|
||
AND order_date = '${day_id}';
|
||
|
||
-- EXISTS 子查询
|
||
SELECT *
|
||
FROM db_name.products p
|
||
WHERE EXISTS (
|
||
SELECT 1 FROM db_name.inventory i
|
||
WHERE i.product_id = p.product_id
|
||
AND i.quantity > 0
|
||
);
|
||
|
||
-- ============================================================================
|
||
-- 7. 条件聚合(CASE WHEN + 聚合)
|
||
-- ============================================================================
|
||
|
||
SELECT
|
||
order_date,
|
||
COUNT(*) AS total_orders,
|
||
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_count,
|
||
SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled_count,
|
||
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending_count,
|
||
SUM(CASE WHEN total_amount > 1000 THEN total_amount ELSE 0 END) AS high_value_amount
|
||
FROM db_name.orders
|
||
WHERE order_date = '${day_id}'
|
||
GROUP BY order_date;
|
||
|
||
-- ============================================================================
|
||
-- 8. Bitmap 精确去重(Doris 特有)
|
||
-- ============================================================================
|
||
|
||
-- 使用 bitmap 做精确去重(需要在 Aggregate Key 模型中定义 BITMAP 类型列)
|
||
-- 注意:bitmap 函数只能用于包含 BITMAP 类型列的表
|
||
|
||
-- 精确去重计数(预计算场景,在 Aggregate Key 表中使用 BITMAP_UNION)
|
||
-- 建表时 Value 列定义:user_id_bitmap BITMAP BITMAP_UNION
|
||
-- 查询时:
|
||
-- SELECT date, bitmap_union_count(user_id_bitmap) AS uv FROM table GROUP BY date;
|
||
|
||
-- HLL 近似去重
|
||
-- 建表时 Value 列定义:user_id_hll HLL HLL_UNION
|
||
-- 查询时:
|
||
-- SELECT date, hll_union_agg(user_id_hll) AS approx_uv FROM table GROUP BY date;
|