查询以显示每个用户的前 3 条记录,其中用户至少提交了 3 条记录?
Query to show top 3 records per user where the user has submitted a minimum of 3?
我在 MS SQL 中有一个 table,每个用户有多个条目。我正在尝试按日期为每个用户获取前 3 个条目。我有一个查询,returns returns 每个用户最多前 3 个条目,但也 returning 用户提交了 2 或 1 个条目。我加入了另一个 table 只是为了获得电子邮件地址。我希望它只 return john 和 dave 的条目,因为他们有 3 个条目。如果他们有超过 3 个 return 提交月份的前 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
这个returns
| 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
感谢您的帮助。
添加 count
window 函数,然后对其进行过滤。
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
我在 MS SQL 中有一个 table,每个用户有多个条目。我正在尝试按日期为每个用户获取前 3 个条目。我有一个查询,returns returns 每个用户最多前 3 个条目,但也 returning 用户提交了 2 或 1 个条目。我加入了另一个 table 只是为了获得电子邮件地址。我希望它只 return john 和 dave 的条目,因为他们有 3 个条目。如果他们有超过 3 个 return 提交月份的前 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
这个returns
| 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
感谢您的帮助。
添加 count
window 函数,然后对其进行过滤。
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