从列表中获取查询的第一行
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
带参数:
- 间隔:5分钟
- 标签:'Tag1'
- 开始日期时间:'2014-02-26 09:00:00'
- 结束日期时间:'2014-02-26 11:00:00'
查询结果:
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
我有一个 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
带参数:
- 间隔:5分钟
- 标签:'Tag1'
- 开始日期时间:'2014-02-26 09:00:00'
- 结束日期时间:'2014-02-26 11:00:00'
查询结果:
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