首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个时间差为3分钟的行中取一行

从多个时间差为3分钟的行中取一行
EN

Stack Overflow用户
提问于 2019-12-27 19:35:43
回答 2查看 57关注 0票数 0

我有一个可以读取RFID卡的RFID阅读器。因此,它将所有传递到RFID机器的卡插入到我拥有的读取表中

代码语言:javascript
复制
 ReadTable (ReadId, CardNumber , ReadDate , ReaderId )

记录,例如:

代码语言:javascript
复制
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。我怎样才能做到这一点呢?

EN

回答 2

Stack Overflow用户

发布于 2019-12-27 19:38:15

你想要row_number()

代码语言:javascript
复制
select rt.*
from (select rt.*, row_number() over (partition by CardNumber order by ReadDate) as seq
      from ReadTable rt
     ) rt
where seq = 1;
票数 0
EN

Stack Overflow用户

发布于 2019-12-27 19:38:53

如果我没理解错的话,您想要每个cardnumber的最早行。如果是这样,我建议使用相关子查询:

代码语言:javascript
复制
select r.*
from readtable r
where r.readdate = (select min(r2.readdate)
                    from readtable r2
                    where r2.cardnumber = r.cardnumber
                   );

对于readtable(cardnumber, readdate)上的索引,这通常比替代方法具有更好的性能(尽管性能确实取决于许多因素,因此并不总是如此)。

编辑:

我意识到标题暗示着略有不同的逻辑。如果您想要前一行超过三分钟的行,那么我建议使用lag()

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59500194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档