【问题标题】:Query to show top 3 records per user where the user has submitted a minimum of 3?查询以显示每个用户提交的最少 3 条记录的前 3 条记录?
【发布时间】:2020-12-15 18:40:45
【问题描述】:

我在 MS SQL 中有一个表,每个用户有多个条目。我正在尝试按日期为每个用户获取前 3 个条目。我有一个查询返回每个用户最多返回前 3 个条目,但也返回已提交 2 个或 1 个条目的用户。我加入另一个表只是为了获取电子邮件地址。我希望它只返回 john 和 dave 的条目,因为他们有 3 个条目。如果他们有超过 3 个,只需按 submitmonth 返回前 3 个。

    select * from (
    select m.Email, q.submitmonth, q.A2, q.A7, q.C7, q.C8, q.C16, q.F9, q.F10, q.G4, q.H1, q.H2, q.J2, q.J13, q.K18, q.N1, q.P6,
           row_number() over (partition by q.userid order by q.submitmonth desc) as Submitted 
    from dbo.submission q
left join dbo.users m
on q.UserId = m.UserId ) ranks
where Submitted  < 4

返回

| Email             | submitmonth   | A2   | A7   | Submitted
|                   |               |      |      |
| john@yahoo.com    |  01/08/2020   | 2    | 4    |    1
| john@yahoo.com    |  01/07/2020   | 8    | 8    |    2
| john@yahoo.com    |  01/06/2020   | 2    | 1    |    3
| bob@gmail.com     |  01/08/2020   | 1    | 3    |    1
| bob@gmail.com     |  01/07/2020   | 9    | 7    |    2
| pete@yahoo.co.uk  |  01/08/2020   | 8    | 5    |    1
| dave@gmail.com    |  01/06/2020   | 3    | 6    |    1
| dave@gmail.com    |  01/04/2020   | 5    | 6    |    2
| dave@gmail.com    |  01/02/2020   | 1    | 6    |    3

感谢您的帮助。

【问题讨论】:

    标签: sql sql-server tsql greatest-n-per-group


    【解决方案1】:

    添加count窗口函数,然后对其进行过滤。

    select *
    from (
        select m.Email, q.submitmonth, q.A2, q.A7, q.C7, q.C8, q.C16, q.F9, q.F10, q.G4, q.H1, q.H2, q.J2, q.J13, q.K18, q.N1, q.P6
            , row_number() over (partition by q.userid order by q.submitmonth desc) as Submitted
            , count(*) over (partition by q.userid) TotalSubmitted
        from dbo.submission q
        left join dbo.users m on q.UserId = m.UserId
    ) ranks
    where Submitted < 4 and TotalSubmitted >= 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2012-12-09
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2015-09-05
      相关资源
      最近更新 更多