限制列值重复到前 2
Limit column value repeats to top 2
所以我有这个查询:
SELECT
Search.USER_ID,
Search.SEARCH_TERM,
COUNT(*) AS Search.count
FROM Search
GROUP BY 1,2
ORDER BY 3 DESC
其中 returns 看起来像这样的响应:
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
我的问题是:如何更改查询,使其仅 returns 任何给定用户搜索最多的前 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
在SQL服务器中,可以把原来的查询放到一个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 服务器作为我在这里使用的 dbms,但上面应该符合 ANSI 标准并在 Snowflake 中工作。
所以我有这个查询:
SELECT
Search.USER_ID,
Search.SEARCH_TERM,
COUNT(*) AS Search.count
FROM Search
GROUP BY 1,2
ORDER BY 3 DESC
其中 returns 看起来像这样的响应:
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
我的问题是:如何更改查询,使其仅 returns 任何给定用户搜索最多的前 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
在SQL服务器中,可以把原来的查询放到一个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 服务器作为我在这里使用的 dbms,但上面应该符合 ANSI 标准并在 Snowflake 中工作。