首页 > 解决方案 > 限制列值重复到顶部 2

问题描述

所以我有这个查询:

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

标签: sqlansi-sqlsnowflake-cloud-data-platform

解决方案


在 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 中工作。


推荐阅读