我有一个只有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
但它带来了所有记录。 有人做过这样的事吗? 谢谢你的期待!
答案 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