我有一张20000条记录的表格。每个记录都有一个日期时间字段。我想选择一条记录和后续记录之间的差距超过一小时的所有记录[在日期时间字段上应用的条件]。
任何人都可以为此提供SQL命令代码。
问候
KAM
答案 0 :(得分:4)
ANSI SQL支持lead()
函数。但是,日期/时间功能因数据库而异。以下是您需要的逻辑,尽管确切的语法因数据库而异:
select t.*
from (select t.*,
lead(datetimefield) over (order by datetimefield) as next_datetimefield
from t
) t
where datetimefield + interval '1 hour' < next_datetimefield;
注意:在Teradata中,where
将是:
where datetimefield + interval '1' hour < next_datetimefield;
答案 1 :(得分:2)
这也可以通过子查询来完成,该查询应该适用于所有 DBMS。正如戈登所说,日期/时间功能各不相同。
for(unsigned int i = 0; i < somemore.size(); i++)
{
for(unsigned int j = 0; j < some.size(); j++)
{
std::cout << somemore[i][j] << std::endl;
}
}
你可以替换它:
SELECT t.* FROM YourTable t
WHERE t.DateCol + interval '1 hour' < (SELECT min(s.DateCol) FROM YourTable s
WHERE t.ID = s.ID AND s.DateCol > t.DateCol)
使用其中之一,它几乎适用于所有DBMS:
t.DateCol + interval '1 hour'
答案 2 :(得分:2)
虽然Teradata不支持标准SQL的LEAD
,但它很容易重写:
select tab.*,
min(ts) over (order by ts rows between 1 following and 1 following) as next_ts
from tab
qualify
ts < next_ts - interval '1' hour
如果您不需要显示下一个时间戳:
select *
from tab
qualify
ts < min(ts) over (order by ts rows between 1 following and 1 following) - interval '1' hour
QUALIFY
是一个Teradata扩展程序,但非常好,类似HAVING
之后的GROUP BY