从列表中获取查询的第一行

Getting the fist row of a query from a list

我有一个 table,其中有许多具有时间序列数据的标签 示例:

TagName  Value  DateTime              Quality
Tag1      75    09/24/2015 01:05:10    192 
Tag1      76.5  09/24/2015 01:05:20    192 
Tag1      75    09/24/2015 01:05:40    192 
Tag1      74.5  09/24/2015 01:06:00    192 
Tag2      75    09/24/2015 01:05:10    192
Tag2      76.5  09/24/2015 01:05:20    192 
Tag2      75    09/24/2015 01:05:40    192 
Tag2      74.5  09/24/2015 01:06:00    192

我需要查询 StartDate 和 EndDate 之间的标签(多个)和一个间隔(5 分钟/15 分钟)

此查询有效:

SELECT * FROM   
(SELECT [DateAndTime],[TagName],[Val],row_number()over(partition by datepart(minute, [DateAndTime])order by [DateAndTime] ) as "rn"
FROM [FloatTable]   WHERE
([DateAndTime] BETWEEN @StartDateTime AND @EndDateTime) AND 
([TagName] IN (@TagName)) AND
( (DATEPART("n",[DateAndTime]) % @IntervalInMins = 0) )) x
WHERE rn = 1

带参数:

查询结果:

TagName  Value  DateTime              Quality    
Tag1     75    09/24/2015 01:05:10    192     
Tag1     76.5  09/24/2015 01:10:10    192     
Tag1     75    09/24/2015 01:16:40    192

但这仅在我们一次查询 1 个标签时有效。通常我们想要查询标签列表。如果我查询标签列表 'Tag1,Tag2',查询只给出 Tag1 的结果。请指教

我认为您只需要将 tagname 添加到 partition by 并删除 where 中的过滤:

SELECT x.*
FROM (SELECT [DateAndTime], [TagName], [Val],
             row_number() over (partition by tagname, datepart(minute, [DateAndTime])
                                order by [DateAndTime]
                               ) as rn
      FROM [FloatTable]
      WHERE ([DateAndTime] BETWEEN @StartDateTime AND @EndDateTime) AND 
            ( (DATEPART("n",[DateAndTime]) % @IntervalInMins = 0) )
     ) x
WHERE rn = 1