获取前 5 名的 SQL 语句

Posted

技术标签:

【中文标题】获取前 5 名的 SQL 语句【英文标题】:SQL statement for getting top 5 【发布时间】:2014-06-29 00:06:46 【问题描述】:

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

例如:印度排名第一,来自印度的用户选择了属性部分,瑞典排名第二,瑞典热门部分是汽车,...

表名:ads

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

【问题讨论】:

你有没有尝试过任何东西? 描述也有些模棱两可和不清楚。您最好提供示例数据和期望的结果。例如,我不知道the most popular section in each of those 5 countries counties 是什么意思。 user from India 也应该是 users from India? 嗨 Ali 我试试这个说法:Select Top 5 Country,Section from ads 但它没有给我每个国家的热门部分,所以我不知道该怎么做,所以我问专业人士这里 @Martin Smith 感谢您的回复,我想在我的数据库中获得广告来自的前 5 个国家,并且我想获得每个国家选择的最多的部分,希望会更清楚:-) 当您说前 5 个国家时...您只需要任何五个国家或您是否也有前 5 个国家的标准?因为您的查询 Select top 5 只是得到 5 行,没有应用条件 【参考方案1】:

如果我理解正确,您希望在 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

【讨论】:

这真是太棒了,我正在寻找的东西真的很感谢你,但是我可以显示每个国家的前 3 个部分而不是上面代码中的 1 个 再次感谢,但您能否检查一下,因为它给了我一个错误:Msg 102, Level 15, State 1, Line 4 Incorrect syntax near '('. Msg 156, Level 15, State 1, Line 9 关键字“ORDER”附近的语法不正确。消息 102,级别 15,状态 1,第 14 行“t2”附近的语法不正确。 我仍然收到此错误 :-( : Msg 102, Level 15, State 1, Line 14 '=' 附近的语法不正确。 :-(((Msg 156, Level 15, State 1, Line 15 关键字“WHERE”附近的语法不正确。 thanksssssssss sooooooo much FuzzyTree 我真的很抱歉打扰你【参考方案2】:
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

【讨论】:

以上是关于获取前 5 名的 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章

获取一个数据表所有字段名的SQL怎么写

oracle sql语句获取前两条数据

sql中如何获取当天时间的零点

转:怎么用Sql语句获取一个数据库中的所有表的名字

sql server 分组成绩前100名的数据

SQL 动态SQL语句查询获取数据