Sql select语句中的嵌套查询,用于根据从外部查询派生的字段对条目进行计数

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

我正在努力做一件我认为应该可以实现的事情,但我无法让它发挥作用……以下是场景:

我有两张表格,结构如下:

1-每10分钟记录一次数据的表格:tab_循环

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