select * from ( select pyear, rank() over(partition by pyear order by sumamount desc) as rk, p_id, sumamount from ( select year(pro_purchase_time) as pyear, p_id, sum(p_amount * pro_quantity) as sumamount from property, finances_product where pro_pif_id = p_id and pro_type = 1 and year(pro_purchase_time) in (2010,2011) group by p_id, pyear ) as temp1 ) as temp2 where rk <= 3
时间: 2024-02-14 14:33:54 浏览: 120
这段代码是一个 SQL 查询语句,用于查询在 2010 年和 2011 年中销售额最高的前三个产品。具体来说,这个查询使用了多个嵌套的子查询和窗口函数(window function),以实现对数据的分组、排序和筛选。下面是这个查询的具体步骤:
1. 子查询 temp1:从表 property 和 finances_product 中选择符合条件的记录,并按照年份和产品 ID 进行分组。具体来说,查询条件为 pro_pif_id = p_id and pro_type = 1 and year(pro_purchase_time) in (2010,2011),即选择产品类型为 1(假设为某种商品)和购买年份为 2010 或 2011 的记录。然后,对每个年份和产品 ID 组合计算销售额,即 sum(p_amount * pro_quantity),并将结果命名为 sumamount。
2. 子查询 temp2:在子查询 temp1 的基础上,使用窗口函数 rank() over() 对每个年份内的销售额进行排名,并将排名结果命名为 rk。其中,partition by pyear 表示按照年份进行分组,order by sumamount desc 表示按照销售额降序排序。这样,每个年份内的销售额排名就可以通过 rk 来获取,rk 值越小表示销售额越高。
3. 主查询:从子查询 temp2 中选择排名前三的记录,并返回所有列(使用 * 通配符)。具体来说,查询条件为 where rk <= 3,表示只选择 rk 值小于等于 3 的记录,即每个年份内销售额最高的前三个产品。
阅读全文