我有一个TSQL查询,它返回一个变量名称列表及其在某个时间点的值。目前它正在截断日期时间列,以便为我提供每分钟的结果集。
能够指定我想要的任何数据间隔对我来说非常有用。每x秒,每x分钟或每x小时。
我不能GROUP BY,因为我不想聚合选定的值。
这是我当前的查询:
SELECT time, var_name, value
FROM (
SELECT time, var_name, value, ROW_NUMBER() over (partition by var_id, convert(varchar(16), time, 121) order by time desc) as seqnum
FROM var_values vv
JOIN var_names vn ON vn.id = vv.tag_id
WHERE ( var_id = 1 OR var_id = 2)
AND time >= '2013-06-04 00:00:00' AND time < '2013-06-04 16:20:17'
) k
WHERE seqnum = 1
ORDER BY time;
结果集:
2013-06-04 00:20:52.847 Random.Boolean 0
2013-06-04 00:20:52.850 Random.Int1 76
2013-06-04 00:21:52.893 Random.Boolean 1
2013-06-04 00:21:52.897 Random.Int1 46
2013-06-04 00:22:52.920 Random.Boolean 1
2013-06-04 00:22:52.927 Random.Int1 120
另外,为了完成,我想保留修改WHERE子句的能力,以便在我的结果集中选择我想要的var_id。
答案 0 :(得分:2)
您应该能够通过unix时间戳除以所需的时间间隔(以秒为单位)进行分区;
(PARTITION BY var_id, DATEDIFF(SECOND,{d '1970-01-01'}, time) / 60 -- 60 seconds
ORDER BY TIME DESC) AS seqnum
计算将在60秒内给出相同的结果,这会将间隔中的所有行放在同一分区内。