Files
smart-data-dev-skill/one-skill/smart-data-developer/references/sql/templates/doris/query-template.sql
2026-05-13 11:03:00 +08:00

190 lines
5.7 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =====================================================================
-- @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;