【问题标题】:Getting the fist row of a query from a list从列表中获取查询的第一行
【发布时间】:2017-03-02 06:45:39
【问题描述】:

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

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'
  • EndDateTime: '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 的结果。请指教。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql partition


【解决方案1】:

我认为您只需将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

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2017-03-27
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多