如何从一组记录中获取第一条记录MS sql

时间:2018-09-04 14:17:40

标签: sql sql-server tsql

我有几个带有记录添加日期的业务部门ID,我想获取仅添加最后一条记录时的行

2018-06-26 22:54:51.190 1
2018-07-05 10:36:49.563 1
2018-07-16 10:14:04.093 1
2018-07-17 15:24:22.173 1
2018-07-19 10:40:24.700 1
2018-07-23 09:53:34.607 13
2018-07-23 09:53:57.107 13
2018-09-04 14:55:04.860 4
2018-09-04 14:56:34.147 4

应该是

2018-07-19 10:40:24.700 1
2018-07-23 09:53:57.107 13
2018-09-04 14:56:34.147 4

我尝试过

select  
mnt.DateAdded,
bu.BuId
from BusinessUnit bu
inner join MagicNumbersTable mnt on mnt.BuId = bu.BuId
where bu.BuId in  (select top 1 b.BuId
                     from BusinessUnit b inner join MagicNumbersTable m on b.BuId = m.BuId
                     group by  b.BuId, m.DateAdded
                     order by m.DateAdded desc)

只返回一条记录,而不按每bu加上日期的desc返回每个第一条记录

实现此目标的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以将row_number()函数与 ties 子句一起使用:

select top (1) with ties mnt.DateAdded, bu.BuId
from BusinessUnit bu inner join 
     MagicNumbersTable mnt 
     on mnt.BuId = bu.BuId
order by row_number() over (partition by bu.BuId order by mnt.DateAdded desc);

但是,您可以简单地将GROUP BYMAX()一起使用,但是假设您想要更多有关此的信息。如果没有,那么GROUP BY条就足以实现不需要使用subuqeryrow_number()

答案 1 :(得分:0)

根据我的理解,我写了这篇。您对此有何看法。

create table #maxDate (date datetime, id int)

insert #maxDate values
  ( '2018-06-26 22:54:51.190', 1)
, ( '2018-07-05 10:36:49.563', 1)
, ( '2018-07-16 10:14:04.093', 1)
, ( '2018-07-17 15:24:22.173', 1)
, ( '2018-07-19 10:40:24.700', 1)
, ( '2018-07-23 09:53:34.607', 13)
, ( '2018-07-23 09:53:57.107', 13)
, ( '2018-09-04 14:55:04.860', 4)
, ( '2018-09-04 14:56:34.147', 4)

select id, max(date) date from #maxDate
group by id

id              date
-------------------------------
 1      2018-07-19 10:40:24.700
 4      2018-09-04 14:56:34.147
 13     2018-07-23 09:53:57.107

如果查询需要更新,请回复我。