获得前5名的SQL语句

时间:2014-06-29 00:06:46

标签: sql

我有一张名为ads的表格,我希望获得广告来自前5个国家/地区,以及这5个国家/地区中最受欢迎的部分。

例如:印度排名第一,印度用户选择了属性栏目,瑞典排名前2,瑞典热门栏目是汽车,...

表名:ads

  [AdsID] Primary key
  ,[UID] 
  ,[Section]
  ,[Category]
  ,[Country]
  ,[State]
  ,[City]
  ,[AdsTit]
  ,[AdsDesc]
  ,[AdsPrice]
  ,[Img1]
  ,[Img2]
  ,[Img3]
  ,[Img4]
  ,[Img5]
  ,[Wtags]
  ,[AdsDate]
  ,[Website]
  ,[premium]

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望在ads表中出现次数最多的前5个国家/地区,以及您希望显示其最常见部分的每个国家/地区。

下面的查询通过按国家/地区对广告表进行分组并对计数进行排序并使用子查询来选择每个国家/地区最受欢迎的部分来选择前5个国家/地区。

SELECT TOP 5 Country , (
    SELECT TOP 1 Section FROM ads a2
    WHERE a2.Country = a1.Country
    GROUP BY Section
    ORDER BY COUNT(*) DESC
) TopSection
FROM ads a1
GROUP BY Country
ORDER BY COUNT(*) DESC

显示前5个国家/地区的前3个部分

SELECT TOP 5 Country , (
    SELECT TOP 1 Section FROM (
        SELECT Section, 
        ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) rank
        FROM ads a2    
        WHERE a2.Country = a1.Country
        GROUP BY Section
    ) t1 WHERE rank = 1
) Top1Section, (
    SELECT TOP 1 Section FROM (
        SELECT Section, 
        ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) rank
        FROM ads a2    
        WHERE a2.Country = a1.Country
        GROUP BY Section
    ) t1 WHERE rank = 2
) Top2Section, (
    SELECT TOP 1 Section FROM (
        SELECT Section, 
        ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) rank
        FROM ads a2    
        WHERE a2.Country = a1.Country
        GROUP BY Section
    ) t1 WHERE rank = 3
) Top3Section
FROM ads a1
GROUP BY Country
ORDER BY COUNT(*) DESC

答案 1 :(得分:0)

SELECT
    Ad.[Country],
    Ad.[Category]
FROM 
    (SELECT
        [Country],
        [Category],
        RANK() 
        OVER (PARTITION BY [Country] ORDER BY [Country] DESC ) AS RANK
        FROM [Ads]
    ) AS Ad WHERE RANK <= 5