使用sqlserver仅选择较新的日期

时间:2017-03-28 19:06:28

标签: sql sql-server sql-server-2008-r2

我有一个只有3列的表,我试图只选择最近/更新的日期:

account_id -    event_time   -  sign

    2251    2017-03-28 19:00:04  YES
    2250    2017-03-28 15:45:11  NO
    2250    2017-03-28 01:01:45  NO
    2249    2017-03-24 21:00:03  YES
    2248    2017-03-24 05:45:10  NO
    2247    2017-03-19 21:00:05  YES
    2246    2017-03-19 05:45:10  NO
    2245    2017-03-22 21:15:05  YES

我正在尝试取回这些值,因为它们是表格中的最新值:

    2251    2017-03-28 19:00:04  YES
    2250    2017-03-28 15:45:11  NO
    2250    2017-03-28 01:01:45  NO

我试过了:

SELECT account_id, max(event_time) as event_time, sign
FROM mytable 
group by account_id,event_time, sign
order by event_time desc

但它带来了所有记录。 有人做过这样的事吗? 谢谢你的期待!

4 个答案:

答案 0 :(得分:2)

您可以使用子查询

select * from yourtable 
    where event_time >= (select convert(date, max(event_time)) from yourtable)

使用此输入

create table #yourlog(account_id int, event_time datetime, signin varchar(10))

insert into #yourlog (
account_id ,    event_time   ,  signin)
 values
 (    2251  ,'2017-03-28 19:00:04','YES' )
,(    2250  ,'2017-03-28 15:45:11','NO ' )
,(    2250  ,'2017-03-28 01:01:45','NO ' )
,(    2249  ,'2017-03-24 21:00:03','YES' )
,(    2248  ,'2017-03-24 05:45:10','NO ' )
,(    2247  ,'2017-03-19 21:00:05','YES' )
,(    2246  ,'2017-03-19 05:45:10','NO ' )
,(    2245  ,'2017-03-22 21:15:05','YES' )

你得到了

  

account_id event_time登录

     

2251 2017-03-28 19:00:04.000是的

     

2250 2017-03-28 15:45:11.000否

     

2250 2017-03-28 01:01:45.000 NO

答案 1 :(得分:1)

使用top with ties返回最新日期的所有记录:

select top 1 with ties
    account_id
  , event_time
  , sign
from mytable
order by convert(date,event_time) desc

rextester演示:http://rextester.com/OBPT49409

返回:

+------------+---------------------+------+
| account_id |     event_time      | sign |
+------------+---------------------+------+
|       2251 | 2017-03-28 19:00:04 | YES  |
|       2250 | 2017-03-28 15:45:11 | NO   |
|       2250 | 2017-03-28 01:01:45 | NO   |
+------------+---------------------+------+

前3个日期的所有记录:

select 
    t.account_id
  , t.event_time
  , t.sign
from mytable t
  inner join (
    select distinct top 3 
        convert(date,event_time) as event_time 
    from mytable 
    order by event_time desc
    ) topthree 
      on convert(date,t.event_time) = topthree.event_time

返回:

+------------+---------------------+------+
| account_id |     event_time      | sign |
+------------+---------------------+------+
|       2251 | 2017-03-28 19:00:04 | YES  |
|       2250 | 2017-03-28 15:45:11 | NO   |
|       2250 | 2017-03-28 01:01:45 | NO   |
|       2249 | 2017-03-24 21:00:03 | YES  |
|       2248 | 2017-03-24 05:45:10 | NO   |
|       2245 | 2017-03-22 21:15:05 | YES  |
+------------+---------------------+------+

答案 2 :(得分:1)

使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by account_id order by event_time desc) as seqnum
      from mytable t
     ) t 
where seqnum = 1
order by event_time desc;

答案 3 :(得分:1)

SELECT top 3 *
  FROM mytable 
 ORDER BY event_time DESC