如何在SurrealDB的子查询中使用别名?解决daily_sales分组查询问题
SurrealDB 按月份分组获取最佳销售额及对应日期的解决方案
针对daily_sales表按month_year分组展示best_sales和best_day的需求,这里提供两种实用的查询写法,解决你遇到的日期关联及子查询别名问题:
方法一:WITH子句预计算月度最大值再关联
先通过WITH子句算出每个月的最高销售额,再关联原表匹配对应日期:
WITH monthly_max AS ( SELECT date::format(<datetime>sale_date, '%Y-%m') AS month_year, MAX(sales_amount) AS best_sales FROM daily_sales GROUP BY month_year ) SELECT mm.month_year, mm.best_sales, ds.sale_date AS best_day FROM monthly_max mm JOIN daily_sales ds ON date::format(<datetime>ds.sale_date, '%Y-%m') = mm.month_year AND ds.sales_amount = mm.best_sales;
如果同一月份存在多天销售额等于最大值,该查询会返回所有对应日期;若需仅保留一条,可在SELECT后加DISTINCT或对sale_date用MIN()/MAX()聚合。
方法二:窗口函数直接标记最优记录
利用窗口函数在分组内排序后提取目标值,无需额外关联:
SELECT DISTINCT date::format(<datetime>sale_date, '%Y-%m') AS month_year, FIRST_VALUE(sales_amount) OVER ( PARTITION BY date::format(<datetime>sale_date, '%Y-%m') ORDER BY sales_amount DESC, sale_date ASC ) AS best_sales, FIRST_VALUE(sale_date) OVER ( PARTITION BY date::format(<datetime>sale_date, '%Y-%m') ORDER BY sales_amount DESC, sale_date ASC ) AS best_day FROM daily_sales;
这里通过PARTITION BY按月份分组,ORDER BY先按销售额降序排序,再按日期升序确保同月多极值时取最早日期;FIRST_VALUE提取分组内第一条数据的值,最后用DISTINCT去重得到每个月唯一的结果。
这两种写法都避开了SELECT子句内嵌套子查询无法保留主查询别名的问题,直接通过WITH或窗口函数实现需求。
内容的提问来源于stack exchange,提问作者Jesse Benjamin Slomowitz
相关产品推荐
相关产品推荐

