【问题标题】:Limit column value repeats to top 2限制列值重复到顶部 2
【发布时间】:2018-09-27 16:08:33
【问题描述】:

所以我有这个查询:

SELECT 
    Search.USER_ID,
    Search.SEARCH_TERM,
    COUNT(*) AS Search.count
FROM Search

GROUP BY 1,2
ORDER BY 3 DESC

返回如下所示的响应:

USER_ID   SEARCH_TERM    count
bob       dog            50
bob       cat            45
sally     cat            38
john      mouse          30
sally     turtle         10
sally     lion           5
john      zebra          3
john      leopard        1

我的问题是:我将如何更改查询,以便它只返回任何给定用户的前 2 个最常搜索的词?所以在上面的例子中,Sally 的最后一行将被删除,John 的最后一行也将被删除,总共留下 6 行;每个用户 2 个,如下所示:

USER_ID   SEARCH_TERM    count
bob       dog            50
bob       cat            45
sally     cat            38
john      mouse          30
sally     turtle         10
john      zebra          3

【问题讨论】:

  • 哪个数据库引擎?有些有更简单的方法可以做到这一点,有些则需要更多的工作
  • 抱歉,一开始就应该提供该信息 - 它在 Snowflake 中运行。

标签: sql ansi-sql snowflake-cloud-data-platform


【解决方案1】:

在 SQL Server 中,您可以将原始查询放入 CTE,添加 ROW_NUMBER() 函数。然后在新的主查询中,只需添加一个WHERE 子句来限制行号。您的查询将如下所示:

;WITH OriginalQuery AS
(
    SELECT 
        s.[User_id]
        ,s.Search_Term
        ,COUNT(*) AS 'count'
        ,ROW_NUMBER() OVER (PARTITION BY s.[USER_ID] ORDER BY COUNT(*) DESC) AS rn
    FROM Search s
    GROUP BY s.[User_id], s.Search_Term
)
SELECT oq.User_id
      ,oq.Search_Term
      ,oq.count
FROM OriginalQuery oq
WHERE rn <= 2
ORDER BY oq.count DESC 

编辑:我将 SQL Server 指定为我在此处使用的 dbms,但以上内容应符合 ANSI 并在 Snowflake 中工作。

【讨论】:

  • 我应该提到,我运行该查询在̶S̶n̶o̶w̶f̶l̶a̶k̶e̶.̶当我试图运行查询以上,̶我得到了以下错误:̶̶̶S̶Q̶L̶ ̶c̶o̶m̶p̶i̶l̶a̶t̶i̶o̶n̶ ̶e̶r̶r̶o̶r̶:̶ ̶s̶y̶n̶t̶a̶x̶ ̶e̶r̶r̶o̶r̶ ̶l̶i̶n̶e̶ ̶1̶ ̶a̶t̶ ̶p̶o̶s̶i̶t̶i̶o̶n̶ ̶1̶ ̶u̶n̶e̶x̶p̶e̶c̶t̶e̶d̶ ̶'̶W̶I̶T̶H̶'̶.̶̶我在SQL坏经过一些小的调整,我设法让它在雪花中运行,它完全按照我的需要工作。谢谢!
猜你喜欢
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多