Add one-skill
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
-- =====================================================================
|
||||
-- @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;
|
||||
Reference in New Issue
Block a user