sql排名分享

-土星- 发布于 2013/12/24 13:29
阅读 157
收藏 0

http://www.1keydata.com/tw/sql/sql-rank.html

语句简单却参透不了,能理解的来分析分析。

加载中
0
aaic
aaic

等价于
SELECT a1.Name, a1.Sales, COUNT(a2.Sales) Sales_Rank 
  FROM Total_Sales a1
 CROSS JOIN Total_Sales a2 
 WHERE a1.Sales <= a2.Sales OR (a1.Sales=a2.Sales AND a1.Name = a2.Name) 
 GROUP BY a1.Name, a1.Sales 
 ORDER BY a1.Sales DESC, a1.Name DESC;


先用Total_Sales和自身做笛卡尔集,结果类似:
name1 name1
name1 name2
name1 name3
name2 name1
name2 name2
name2 name3
name3 name1
name3 name2
name3 name3

然后用WHERE把比自己少的筛除,第一名只剩下自己,第二名剩下第一名和自己,以此类推。结果类似:
a1.name a2.name
name1 name1
name2 name1
name2 name2
name3 name1
name3 name2
name3 name3

在按照a1.name聚组,结果类似
a1.name count(a2.name)
name1 1
name2 2
name3 3


排序就不说了。


其实在ORACLE和MS SQL Server,可以用开窗函数ROW_NUMBER() OVER做,MySQL不了解。

-土星-
-土星-
多谢,终于理解了。 但是,我觉得OR (a1.Sales=a2.Sales AND a1.Name = a2.Name) 这个是多余的,因为a1.Sales <= a2.Sales已经包含了相等的情况。
返回顶部
顶部