Sql select语句中的嵌套查询,用于根据从外部查询派生的字段对条目进行计数
我正在努力做一件我认为应该可以实现的事情,但我无法让它发挥作用……以下是场景: 我有两张表格,结构如下: 1-每10分钟记录一次数据的表格:tab_循环Sql select语句中的嵌套查询,用于根据从外部查询派生的字段对条目进行计数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在努力做一件我认为应该可以实现的事情,但我无法让它发挥作用……以下是场景: 我有两张表格,结构如下: 1-每10分钟记录一次数据的表格:tab_循环 timestamp | value1 | value2 ... | valueN 20140715 10:10 | 10 | 20 ... | x 20140715 10:00 | 14 | 45 ... | x 2-使用事件驱动结构选项卡\ U事件记录数据的表 timestamp
timestamp | value1 | value2 ... | valueN
20140715 10:10 | 10 | 20 ... | x
20140715 10:00 | 14 | 45 ... | x
2-使用事件驱动结构选项卡\ U事件记录数据的表
timestamp | descr | value
20140715 10:09 | a | 10
20140715 10:04 | a | 14
20140715 10:00 | a | 11
20140715 09:59 | a | 10
20140715 09:54 | a | 20
现在我想实现的是,如果不需要使用游标就可以创建select语句,该语句将产生以下结果:
timestamp | value1 | value2 ... | valueN |countEvent
20140715 10:10 | 10 | 20 ... | x | null
20140715 10:00 | 14 | 45 ... | x | 3
因此,基本上计算在时间戳和时间戳+10分钟内生成带有选定标记的选定事件的时间
我尝试了以下几点,但没有多大成功:
SELECT tab_cycle.timestamp AS startTime, DATEADD(mi, 10, tab_cycle.timestamp) AS endTime,
(SELECT COUNT(tab_event.descr) FROM tab_event WHERE tab_event.timestamp BETWEEN tab_cycle.timestamp and DATEADD(mi, 10, tab_cycle.timestamp) AND tab_event.tag LIKE 'A' GROUP BY tag) AS eventCounter
FROM tab_cycle
ORDER BY timestamp DESC
谁能告诉我我做错了什么
谢谢。您只需删除嵌套子查询中的group by:
SELECT tab_cycle.timestamp AS startTime, DATEADD(mm, 10, tab_cycle.timestamp) AS endTime,
(SELECT COUNT(tab_event.descr)
FROM tab_event
WHERE tab_event.timestamp BETWEEN tab_cycle.timestamp and
DATEADD(mm, 10, tab_cycle.timestamp) AND
tab_event.tag LIKE 'A'
) AS eventCounter
FROM tab_cycle
ORDER BY timestamp DESC;
编辑:
我实际上一直在考虑添加这段代码。如果您使用的是SQL Server 2012或更高版本,则问题的答案是使用lead:
我还为表名添加了缩写。这使得查询更易于编写和读取
如果您使用的是较旧版本的SQL Server,则可以对相关子查询或交叉应用执行相同的操作。您只需更改dateaddmm,。。。。到目前为止,。。。或dateaddmi mm是月的简写,所以当你把它加起来时,例如今天的日期,它会在结果上加上10个月 此链接将帮助您了解日期时间部分和相关代码:
我可以把日期倒过来
select table1.timestamp, table1.value1, table1.value2, table1.valueN
, count(tabl2.timestamp)
from table1
left join table2
on datediff(mi, table1.timestamp, table2.timestamp) < 10
and table2.timestamp > table1.timestamp
group by table1.timestamp, table1.value1, table1.value2, table1.valueN
谢谢你指出这是我这边的一个输入错误,纠正了Nice和tanks,它成功了!还有一个问题,如果周期之间的增量时间是可变的,那么是否可以在周期N的时间戳和周期N-1的时间戳之间做一个差,而不是像我用DATEADD做的那样固定10分钟?再次感谢非常感谢的第二个回复,LEAD确实是一个非常强大的指令。
select table1.timestamp, table1.value1, table1.value2, table1.valueN
, count(tabl2.timestamp)
from table1
left join table2
on datediff(mi, table1.timestamp, table2.timestamp) < 10
and table2.timestamp > table1.timestamp
group by table1.timestamp, table1.value1, table1.value2, table1.valueN