如何在SQL Server 2012中从数据库选取3款最畅销产品?
解决SQL Server 2012中获取前三畅销产品的问题
嘿,这个需求太常见了!之前用MAX()只能揪出销量最高的那一款,要拿前三的话,SQL Server 2012给了我们好几个实用的方案,我给你拆解一下:
方案1:最简单的TOP 3 + ORDER BY
如果你的需求是直接取销量最高的前3条记录,不管有没有并列情况,这个方法最直接高效:
SELECT TOP 3 product_name, sales_amount FROM products ORDER BY sales_amount DESC;
注意:如果有多个产品销量和第三名持平,这个语句只会返回其中一部分(总共3条),因为
TOP是严格限制返回行数的。
方案2:用ROW_NUMBER()窗口函数实现唯一排名
要是你需要给每个产品分配唯一的排名(哪怕销量相同,排名也不一样),就用ROW_NUMBER()窗口函数:
SELECT product_name, sales_amount, rank_num FROM ( SELECT product_name, sales_amount, -- 按销量倒序生成唯一排名 ROW_NUMBER() OVER (ORDER BY sales_amount DESC) AS rank_num FROM products ) ranked_products WHERE rank_num <= 3;
举个例子:如果有两款产品销量都是第一,它们的排名会分别是1和2,最终结果只会包含排名1、2、3的三个产品,不会出现并列同排名的情况。
方案3:用DENSE_RANK()处理并列排名
如果想把所有销量进入前三梯队的产品都捞出来(比如多个并列第一、并列第二的情况),就用DENSE_RANK():
SELECT product_name, sales_amount, rank_num FROM ( SELECT product_name, sales_amount, -- 相同销量的产品会获得相同排名,排名不会跳号 DENSE_RANK() OVER (ORDER BY sales_amount DESC) AS rank_num FROM products ) ranked_products WHERE rank_num <= 3;
比如:如果有两款产品销量第一(排名1),一款第二(排名2),两款第三(排名3),这个语句会返回所有这5款产品,因为它们的排名都≤3。
你可以根据自己的业务需求选对应的方法就行!
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

