如何在一秒钟内根据计数和字符串查询顶级记录组 table

How to query top record group conditional on the counts and strings in a second table

我拜访SQL网络大神!!哦,我非常需要你的帮助来解决这个问题,我的生计就靠它了。我在 Alteryx 中用了大约 2 分钟就解决了这个问题,但我需要在 SQL 中编写此查询,而且在复杂的混合和语法方面我对这种语言还比较陌生。 非常感谢您的帮助!! :) xoxox 我无法开始描述

使用SSMS我需要用2tables 'searches'和'events'来查询...

  1. 在 Table 'searches'

    中唯一搜索 ID 数量最多的前 2 [用户]
  2. 条件列表中的[用户]在'events'中至少有1个eventid,其中[事件类型]以“great”开头

这是一个需要发生的事情的例子

search event and end result example

到目前为止我仅有的作品如下,但是天啊天哪,请不要笑 :(

我想做的是..

  1. select table 的唯一用户,搜索次数为 table

  2. inner join selected table from 1 on userid with a table described in 3

  3. 创建 table 个具有 [type] 以“great”开头的事件计数的唯一用户 ID

  4. 过滤内部连接 ​​table 以获得第 1 步中的前 2 个搜索计数

    SELECT 用户 ID,COUNT() 作为搜索计数 来自搜索 按用户 ID 分组 INNER JOIN (SELECT userid, COUNT() as eventcount FROM events WHERE LEFT(type, 5) = "great" AND eventcount>0 Group by userid) ON searches.userid=events.userId

显然,这根本行不通!!!我认为我的结构不对,我过滤“伟大”的方法是错误的。我也不知道如何在不影响内部连接的情况下将“top 2”子句添加到搜索 table 查询中。这段代码需要相当高效,所以如果你有更好的计算效率更高的想法......我爱你很久了

我认为你需要 exists 和 windows 功能 dense_rank 如下:

Select * from
(Select u.userid, dense_rank() over (partition by u.userid order by count(*) desc) as rn
  From users u join searches s on u.userid = s.userid
 Where exists 
      (select 1 from events e
        Where e.userid = u.userid And LEFT(e.type, 5) = 'great')
 Group by u.userid  ) t Where rn <= 2
SELECT top(2) userid, COUNT() as searchcount FROM searches 
where userid in (select userid from events where left(type, 5)='great')
GROUP BY userid
order by count() desc

希望以上查询能为您服务。