我有一个可以读取RFID卡的RFID阅读器。因此,它将所有传递到RFID机器的卡插入到我拥有的读取表中
ReadTable (ReadId, CardNumber , ReadDate , ReaderId )记录,例如:
1 - 1234 2019-12-27 10:56:02.997 2.1
2 - 1234 2019-12-27 10:57:02.997 2.1
3 - 1234 2019-12-27 10:57:25.997 2.1
4 - 1236 2019-12-27 10:57:02.997 2.1
5 - 1236 2019-12-27 10:58:02.997 2.1
6 - 1236 2019-12-27 10:57:50.997 2.1
7 - 1234 2019-12-27 11:57:50.997 2.1
8 - 1234 2019-12-27 11:56:02.997 2.1
9 - 1234 2019-12-27 12:57:02.997 2.1
10 -1234 2019-12-27 12:57:25.997 2.1因此,从这6个记录中,我只需要行号1、4、7和9。我怎样才能做到这一点呢?
发布于 2019-12-27 19:38:15
你想要row_number()
select rt.*
from (select rt.*, row_number() over (partition by CardNumber order by ReadDate) as seq
from ReadTable rt
) rt
where seq = 1;发布于 2019-12-27 19:38:53
如果我没理解错的话,您想要每个cardnumber的最早行。如果是这样,我建议使用相关子查询:
select r.*
from readtable r
where r.readdate = (select min(r2.readdate)
from readtable r2
where r2.cardnumber = r.cardnumber
);对于readtable(cardnumber, readdate)上的索引,这通常比替代方法具有更好的性能(尽管性能确实取决于许多因素,因此并不总是如此)。
编辑:
我意识到标题暗示着略有不同的逻辑。如果您想要前一行超过三分钟的行,那么我建议使用lag()
select r.*
from (select r.*,
lag(readdate) over (partition by cardnumber order by readdate) as prev_readdate
from readtable r
) r
where prev_readdate is null or
prev_readdate < dateadd(minute, -3, readdate);https://stackoverflow.com/questions/59500194
复制相似问题