1

我有一个 TSQL 查询,它在某个时间点返回变量名称及其值的列表。目前它正在截断 datetime 列,以便为我提供每分钟的结果集。

能够指定我想要的任何数据间隔对我来说非常有用。每 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 的能力。

4

1 回答 1

2

您应该能够按 unix 时间戳除以所需的间隔(以秒为单位)进行分区;

(PARTITION BY var_id, DATEDIFF(SECOND,{d '1970-01-01'}, time) / 60  -- 60 seconds
 ORDER BY TIME DESC) AS seqnum

计算将在 60 秒内给出相同的结果,这会将所有行放在同一分区内的区间内。

于 2013-06-04T16:55:08.197 回答