有关时间附近的最近的取值的SQL语句应该怎么写?

ChinaTek 2015-02-11 04:04:00
表名:tbData
字段:
自动ID 设备ID 时间 数值1 数值2
autoID, devID, curTime, v1, v2
1 001 2014-10-10 10:12:35 3.5 3.8
2 001 2014-10-10 10:15:40 3.2 3.9
.........

现在需要如下SQL语句:
1、输入条件:设备ID,开始日期,结束日期(001,2014-10-10 2014-10-15)
2、查询结果:
符合当前条件的所有整点记录的值,比如对于001这个设备,在2014-10-10号这天,正常情况下只有24条记录,
即001,在0点,1点,2点,。。23点的值
整点取值的条件:在整点前30分钟之内最靠近整点的那个值。
这样的 SQ语句怎么写?
...全文
309 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hepe00 2015-02-12
  • 打赏
  • 举报
回复
整点取值的条件:在整点前30分钟之内最靠近整点的那个值。 这个条件可以这样取: ROW_NUMBER()OVER(PARTITION BY CONVERT(VARCHAR(13),curTime,120) ORDER BY curTime) AS RN 然后,每个整点有一条最小的记录RN=1。
;WITH CTE(autoID,devID,curTime,v1,v2) AS(
	SELECT 1,'001','2014-10-10 10:12:35',3.5,3.8 UNION ALL
	SELECT 2,'001','2014-10-10 10:15:35',3.2,3.9 UNION ALL
	SELECT 3,'001','2014-10-12 11:11:35',2.5,3.0 UNION ALL
	SELECT 4,'001','2014-10-12 10:12:35',3.5,3.9 UNION ALL
	SELECT 5,'001','2014-10-15 18:12:35',3.5,3.9 UNION ALL
	SELECT 6,'001','2014-10-15 18:12:39',1.2,2.5
)
SELECT * 
FROM (
	SELECT * ,ROW_NUMBER()OVER(PARTITION BY CONVERT(VARCHAR(13),curTime,120) ORDER BY curTime) AS RN
	FROM CTE
) AS D
WHERE D.RN=1 AND D.devID='001' AND D.curTime BETWEEN '2014-10-10 00:00:00' AND '2014-10-15 23:59:59'
/*
1	001	2014-10-10 10:12:35	3.5	3.8	1
4	001	2014-10-12 10:12:35	3.5	3.9	1
3	001	2014-10-12 11:11:35	2.5	3.0	1
5	001	2014-10-15 18:12:35	3.5	3.9	1
*/
唐诗三百首 2015-02-11
  • 打赏
  • 举报
回复
就LZ的测试数据和输入条件(001,2014-10-10 2014-10-15),希望结果是什么? 取哪条记录舍哪条记录?

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧