SQL仅选择最接近15分钟的时间戳

SQL仅选择最接近15分钟的时间戳,sql,select,timestamp,subquery,case,Sql,Select,Timestamp,Subquery,Case,我想对每个15分钟时间值最近的值进行SQL选择。例如: 00:15, 00:30, 00:45, 01:00, 01:15 etc... 基于时间戳,不完全在00秒标记上,使用以下公式,如果已设法将每个值舍入到最接近的15分钟,但我只想要最接近的一个,例如 SELECT dateadd(minute, -1 * datediff(minute, 0, cast(convert(varchar(20),[time],100) as smalldatetime)) % 15,

我想对每个15分钟时间值最近的值进行SQL选择。例如:

00:15,
00:30,
00:45,
01:00,
01:15 etc...
基于时间戳,不完全在00秒标记上,使用以下公式,如果已设法将每个值舍入到最接近的15分钟,但我只想要最接近的一个,例如

SELECT dateadd(minute, -1 * datediff(minute, 0, 
    cast(convert(varchar(20),[time],100) as smalldatetime)) % 15, 
    dateadd(minute, datediff(minute, 0, [time]), 0)) as [TIMESTAMP],
    cast(convert(varchar(20),[time],100) as smalldatetime), [time], 
    tagname , value
FROM hdata
INNER JOIN rtdata
    ON hdata.tag_id = rtdata.id
WHERE tagname = 'M1_WH_004'
order by [TIMESTAMP] desc
注意:我需要内部联接来提取标记名,因为它们不在hdata表中

产生:

因此,对于每15分钟,我只想要最接近15分钟边界的值。对于上述数据,09:45和09:30的数据分别为09:45:15.383和09:30:17.463

我需要子查询还是case语句? 任何帮助都将不胜感激

除此之外,a已经有了一个表,该表每15分钟就与解决方案数据中的数据相似,子查询根据最后两个值执行计算,如下所示:

SELECT DD1.[TIME_STAMP] AS [TIME_STAMP], DD1.[kWh1] AS [kWh1], DD1.[kWh2] AS [kWh2], (DD1.[kWh1] + DD1.[kWh2]) AS [Total] FROM (SELECT a.ID
      ,a.TIME_STAMP
      ,(a.[1_M1_Wh] - (SELECT TOP 1 b.[1_M1_Wh] FROM TagCapture b WHERE b.TIME_STAMP = DATEADD(MINUTE, -15, a.TIME_STAMP))) * 0.04 AS kWh1
      ,(a.[1_M2_Wh] - (SELECT TOP 1 b.[1_M2_Wh] FROM TagCapture b WHERE b.TIME_STAMP = DATEADD(MINUTE, -15, a.TIME_STAMP))) * 0.04 AS kWh2
  FROM [TagCapture] a) DD1 
如何使用此查询中提供的解决方案?我对所有的子查询都有点困惑

i、 e.因此,根据t子查询定义的数据,从上一个15分钟的计数值中减去,然后乘以以获得所需的值,我将在每个from子句中插入t子查询的位置?我似乎无法让它工作。上面就是t查询为“M1”和“M2”定义两个不同标记名的地方


再次提前感谢

看起来您正在使用SQL Server。如果是这样,那么您可以使用row_number来解决这个问题

select t.*
from (select t.*, row_number() over (partition by tagname, time15 order by time) as seqnum
      from (SELECT dateadd(minute, -1 * datediff(minute, 0, cast(convert(varchar(20),[time],100) as smalldatetime)) % 15, dateadd(minute, datediff(minute, 0, [time]), 0)) as [TIMESTAMP], cast(convert(varchar(20),[time],100) as smalldatetime) as time15,
                   [time], tagname , value
            FROM hdata INNER JOIN rtdata
                 ON hdata.tag_id = rtdata.id
            WHERE tagname = 'M1_WH_004'
          ) t
    ) t
where seqnum = 1

看起来您正在使用SQL Server。如果是这样,那么您可以使用row_number来解决这个问题

select t.*
from (select t.*, row_number() over (partition by tagname, time15 order by time) as seqnum
      from (SELECT dateadd(minute, -1 * datediff(minute, 0, cast(convert(varchar(20),[time],100) as smalldatetime)) % 15, dateadd(minute, datediff(minute, 0, [time]), 0)) as [TIMESTAMP], cast(convert(varchar(20),[time],100) as smalldatetime) as time15,
                   [time], tagname , value
            FROM hdata INNER JOIN rtdata
                 ON hdata.tag_id = rtdata.id
            WHERE tagname = 'M1_WH_004'
          ) t
    ) t
where seqnum = 1

啊,是的,这是有效的,只需要将其更改为[TIMESTAMP]order by[time],因为[TIMESTAMP]是一个向下舍入到15分钟边界的值,“time15”实际上应该是“timemin”,刚刚舍入到min:从选择t.*中选择t.*,按标记名分区的行号,[TIMESTAMP]order by[time]作为seqnum从选择日期添加分钟,-1*datediffminute,0,castconvertvarchar20,[time],100作为smalldatetime%15,dateaddminute,datediffminute,0,[time],0作为[TIMESTAMP],castconvertvarchar20,[time],100作为smalldatetime作为timemin,[time],tagname,value…您能帮我扩展一下上述问题吗??@user1801843。您可以编辑我的答案以反映您所做的更改。啊,是的,这很有效,只需按[time]将其更改为[TIMESTAMP]顺序即可,因为[TIMESTAMP]是一个向下舍入到15分钟边界的答案。“time15”实际上应该是“timemin”,刚刚舍入到min:从选择t.*中选择t.[TIMESTAMP],按标记名划分的行数,[TIMESTAMP]从选择dateaddminute,-1*datediffminute,0,castconvertvarchar20,[time],100作为smalldatetime%15,dateaddminute,datediffminute,0,[time],0作为[TIMESTAMP],castconvertvarchar20,[time],100作为smalldatetime作为timemin,[time],标记名,值…你能帮我扩展到上面的问题吗???@user1801843。您可以编辑我的答案以反映您所做的更改。