SQL Server:按一个列和另一个列值选择唯一的数据行

3
这是一个SQL Server表的数据。
id   user_id     start_date   status_id    payment_id
======================================================
2      4         20-nov-11         1          5
3      5         23-nov-11         1         245
4      5         25-nov-11         1         128
5      6         20-nov-11         1         223
6      6         25-nov-11         2         542
7      4         29-nov-11         2         123
8      4         05-jan-12         2         875

我需要按照user_id去重并按照id asc排序,但只保留最高的start_date

我需要以下输出结果:
id   user_id     start_date   status_id    payment_id
======================================================
8      4         05-jan-12         2         875
4      5         25-nov-11         1         128
6      6         25-nov-11         2         542

请帮忙!

这个需要什么SQL查询语句?


请展示一下你已经尝试过的内容 - marc_s
你能假设ID是连续的,因此它将始终是最高的吗?还是当删除发生时,ID会被重新使用?(请注意,你的示例中8、4、6都是该用户的最高ID。因此,你需要每个user_ID的最大ID。) - xQbert
2个回答

4
您可以在子查询或使用CTE中使用row_number()
子查询版本:
select id, user_id, start_date, status_id, payment_id
from
(
  select id, user_id, start_date, status_id, payment_id, 
    row_number() over(partition by user_id order by start_date desc) rn
  from yourtable
) src
where rn = 1

查看 带演示的SQL Fiddle

CTE 版本:

;with cte as
(
  select id, user_id, start_date, status_id, payment_id, 
    row_number() over(partition by user_id order by start_date desc) rn
  from yourtable
)
select id, user_id, start_date, status_id, payment_id
from cte
where rn = 1

请查看带演示的SQL Fiddle

或者您可以将表连接到自身:

select t1.id, 
  t1.user_id, 
  t1.start_date, 
  t1.status_id, 
  t1.payment_id
from yourtable t1
inner join 
(
  select user_id, max(start_date) start_date
  from yourtable
  group by user_id
) t2
  on t1.user_id = t2.user_id
  and t1.start_date = t2.start_date

请查看带演示的SQL Fiddle

所有查询将产生相同的结果:

| ID | USER_ID |                      START_DATE | STATUS_ID | PAYMENT_ID |
---------------------------------------------------------------------------
|  8 |       4 |  January, 05 2012 00:00:00+0000 |         2 |        875 |
|  4 |       5 | November, 25 2011 00:00:00+0000 |         1 |        128 |
|  6 |       6 | November, 25 2011 00:00:00+0000 |         2 |        542 |

至少最后一个查询将返回具有重复最大start_date的User_Id的多行。我必须习惯SQL Fiddle,它真的很酷。 - alzaimar
@alzaimar 只有在同一用户在同一日期有多个条目时才会返回多个。 - Taryn
这就是我所说的(“重复的最大开始日期”)。实际上,只有当给定用户的最高start_date出现两次时,它才会返回多行。但是,由于可能会发生这种情况,我建议您使用其他好的想法。 - alzaimar

0

不是最好的且未经测试:

select *
  from ServersTable 
  join (
    select User_Id, max(Id) as ID
      from ServersTable x
     where x.start_date = (
          select max(start_date)
            from ServersTable y
           where y.UserID = x.UserId
           )
     group by User_Id) s on ServersTable.Id = s.Id

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接