Reference

SQL Snippets

这些 SQL 片段可以作为 Dory 中的起始模板。运行前请替换表名、时间字段,并按目标数据库调整日期函数。

安全预览

在不扫描过多数据的情况下预览表。

SELECT *
FROM your_table
LIMIT 100;

对于宽表,优先只看必要字段:

SELECT id, created_at, status
FROM your_table
ORDER BY created_at DESC
LIMIT 100;

行数统计

SELECT COUNT(*) AS row_count
FROM your_table;

深入分析前,先用它判断表的大致规模。

Top N 分布

SELECT status, COUNT(*) AS records
FROM your_table
GROUP BY status
ORDER BY records DESC
LIMIT 20;

适合状态、分类、国家、事件名、套餐、错误码等字段。

最近记录

SELECT *
FROM your_table
WHERE created_at >= CURRENT_DATE - INTERVAL '7 days'
ORDER BY created_at DESC
LIMIT 200;

不同数据库的日期表达式不同。如果目标数据库不支持这个写法,可以让 Dory AI 转换成 PostgreSQL、MySQL、ClickHouse、SQLite、DuckDB 或 MariaDB 语法。

按天趋势

PostgreSQL、DuckDB 和很多兼容引擎:

SELECT
  DATE_TRUNC('day', created_at) AS day,
  COUNT(*) AS records
FROM your_table
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY day
ORDER BY day;

ClickHouse:

SELECT
  toStartOfDay(created_at) AS day,
  count() AS records
FROM your_table
WHERE created_at >= now() - INTERVAL 30 DAY
GROUP BY day
ORDER BY day;

MySQL 和 MariaDB:

SELECT
  DATE(created_at) AS day,
  COUNT(*) AS records
FROM your_table
WHERE created_at >= CURRENT_DATE - INTERVAL 30 DAY
GROUP BY day
ORDER BY day;

空值检查

SELECT
  COUNT(*) AS total_rows,
  SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) AS missing_email,
  SUM(CASE WHEN created_at IS NULL THEN 1 ELSE 0 END) AS missing_created_at
FROM users;

在把某个字段用于 Join、时间过滤或图表分组前,建议先做空值检查。

重复键检查

SELECT id, COUNT(*) AS duplicates
FROM your_table
GROUP BY id
HAVING COUNT(*) > 1
ORDER BY duplicates DESC
LIMIT 100;

适合验证主键假设、导入数据,以及按自然键应该唯一的事件表。

Join 模板

SELECT
  o.id AS order_id,
  o.created_at,
  o.total_amount,
  u.id AS user_id,
  u.email
FROM orders o
JOIN users u ON u.id = o.user_id
WHERE o.created_at >= CURRENT_DATE - INTERVAL '30 days'
ORDER BY o.created_at DESC
LIMIT 200;

把 Join 用于收入、使用量或客户数统计前,一定要先确认 Join 基数。

Join 基数检查

SELECT
  COUNT(*) AS joined_rows,
  COUNT(DISTINCT o.id) AS distinct_orders,
  COUNT(DISTINCT u.id) AS distinct_users
FROM orders o
JOIN users u ON u.id = o.user_id
WHERE o.created_at >= CURRENT_DATE - INTERVAL '30 days';

如果 joined_rows 明显大于预期的 distinct 数量,需要检查重复键或多对多 Join。

转化漏斗

SELECT
  COUNT(DISTINCT CASE WHEN event_name = 'viewed_page' THEN user_id END) AS viewed_page,
  COUNT(DISTINCT CASE WHEN event_name = 'started_checkout' THEN user_id END) AS started_checkout,
  COUNT(DISTINCT CASE WHEN event_name = 'completed_purchase' THEN user_id END) AS completed_purchase
FROM events
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days';

请按你的产品分析 Schema 替换事件名和用户标识字段。

错误排查

SELECT
  error_code,
  COUNT(*) AS occurrences,
  MAX(created_at) AS last_seen
FROM application_logs
WHERE level = 'error'
  AND created_at >= CURRENT_DATE - INTERVAL '24 hours'
GROUP BY error_code
ORDER BY occurrences DESC
LIMIT 20;

适合日志、任务运行、同步操作和数据导入表。

慢查询样例

SELECT
  query_id,
  user_name,
  duration_ms,
  created_at,
  query_text
FROM query_log
WHERE duration_ms > 5000
ORDER BY duration_ms DESC
LIMIT 50;

不同数据库和监控表的字段名不同,可以用 Dory Schema Explorer 或 AI Chat 调整这个模板。

这篇文档有帮助吗?