求助,一个时间段,如果是相同的值,只取得最后一个时间点的时间和值

mnm0756 2010-11-13 02:14:45
使用的是Sql server 2005 的数据库

Value TimeStamp
NULL 2010-11-12 17:57:58.000
NULL 2010-11-12 17:59:01.000
....
NULL 2010-11-12 17:59:18.000
1.50 2010-11-12 17:59:41.000
1.50 2010-11-12 18:00:01.000
1.50 2010-11-12 18:00:21.000
...
1.50 2010-11-12 18:18:01.000
1.50 2010-11-12 18:18:21.000
1.50 2010-11-12 18:18:41.000
1.80 2010-11-12 18:18:58.000
1.80 2010-11-12 18:19:18.000
..
1.80 2010-11-12 18:33:58.000
1.80 2010-11-12 18:34:21.000
表数据如上:
希望得到的数据是
NULL 2010-11-12 17:57:58.000
NULL 2010-11-12 17:59:18.000
1.50 2010-11-12 17:59:41.000
1.80 2010-11-12 18:18:58.000
1.80 2010-11-12 18:34:21.000
这样的4条记录.请大家帮帮忙.
上面记录的时间或者ID都是连续的.如果value 变化了,就当作另外一个时间点了.
...全文
151 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
已经搞定,最后用的是游标.速度还不错..蛮好的.
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
还没搞定..似乎达不到要求?
--小F-- 2010-11-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mnm0756 的回复:]
不想用临时表,因为数据量比较多.需要花费很长时间.
[/Quote]

既然是2005 就用ROW_NUMBER()OVER撒
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
不想用临时表,因为数据量比较多.需要花费很长时间.
--小F-- 2010-11-13
  • 打赏
  • 举报
回复
先按照这样的方法排序 然后按照我写的取最大最小UNION ALL
还不懂的话问我
--小F-- 2010-11-13
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb] 
go
create table [tb]([value1] int,[value2] int)
insert [tb]
select 1,12 union all
select 1,13 union all
select 1,23 union all
select 0,14 union all
select 0,15 union all
select 1,16 union all
select 0,23 union all
select 0,22 union all
select 1,21 union all
select 1,12

结果:

value1 value2 col3
----------- ----------- -----------
1 12 1
1 13 2
1 23 3
0 14 1
0 15 2
1 16 1
0 23 1
0 22 2
1 21 1
1 12 2

可以写下代码




你的回答: if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([value1] int,[value2] int)
insert [tb]
select 1,12 union all
select 1,13 union all
select 1,23 union all
select 0,14 union all
select 0,15 union all
select 1,16 union all
select 0,23 union all
select 0,22 union all
select 1,21 union all
select 1,12

select id=identity(int,1,1),* into # from tb

select
value1,value2,
col3=
(
select
count(1)
from
#
where
[value1]=a.[value1]
and
id<=a.id
and
id>=(select isnull(max(id),0) from # where id<a.id and value1!=a.value1))
from
# a

--结果:
/*
value1 value2 col3
----------- ----------- -----------
1 12 1
1 13 2
1 23 3
0 14 1
0 15 2
1 16 1
0 23 1
0 22 2
1 21 1
1 12 2
*/
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
数据是基本定时的,但是也不能确定间隔一定是20s,可能中间会断几次也不一定.比如服务器重启之类的.
abuying 2010-11-13
  • 打赏
  • 举报
回复
是不是每隔20秒一行数据?
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
数据会根据 timestamp排序.其实就是随着时间的推移.
value会从null变成1.5,然后稳定一段时间后,从1.5变成1.8,然后稳定一段时间后,由1.8再降成1.5,整个过程就是这样的.所以才会出现
第2个时间段是1.5这个值
第4个时间段是1.5这个值 这种情况

「已注销」 2010-11-13
  • 打赏
  • 举报
回复
第2个时间段是1.5这个值
第4个时间段是1.5这个值
==============
这两个怎么区分开?
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
是有点混乱,下面,我把问题重新详细的描述一下.
使用的是Sql server 2005 的数据库

Value TimeStamp
NULL 2010-11-12 17:57:58.000
NULL 2010-11-12 17:59:01.000
....
NULL 2010-11-12 17:59:18.000
1.50 2010-11-12 17:59:41.000
1.50 2010-11-12 18:00:01.000
1.50 2010-11-12 18:00:21.000
...
1.50 2010-11-12 18:18:01.000
1.50 2010-11-12 18:18:21.000
1.50 2010-11-12 18:18:41.000
1.80 2010-11-12 18:18:58.000
1.80 2010-11-12 18:19:18.000
..
1.80 2010-11-12 18:33:58.000
1.80 2010-11-12 18:34:21.000
1.80 2010-11-12 18:49:01.000
1.50 2010-11-12 18:49:18.000
1.50 2010-11-12 18:49:38.000
1.50 2010-11-12 18:49:58.000
1.50 2010-11-12 18:50:18.000
1.50 2010-11-12 18:50:38.000
1.50 2010-11-12 18:51:01.000
需要取得的数据,是连续时间段中.value相同的情况下,每个时间段开始的TimeStamp 和结束的TimeStamp
上面范例数据应该得到的结果是
NULL 2010-11-12 17:57:58.000
NULL 2010-11-12 17:59:18.000
1.50 2010-11-12 17:59:41.000
1.50 2010-11-12 18:18:41.000
1.80 2010-11-12 18:18:58.000
1.80 2010-11-12 18:49:01.000
1.50 2010-11-12 18:49:18.000
1.50 2010-11-12 18:51:01.000
一共是8条数据.4对数据.
第1个时间段是null值
第2个时间段是1.5这个值
第3个时间段是1.8这个值
第4个时间段是1.5这个值


「已注销」 2010-11-13
  • 打赏
  • 举报
回复
你先把你思路理顺了,就这点问题你不觉得被你描述的乱七八糟的么?
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
这个估计不行吧
我上面的范例数据有一个关键点,我没说清楚.
value 会出现这种情况.
第1个时间段是null值
第2个时间段是1.5这个值
第3个时间段是1.8这个值
第4个时间段是1.5这个值
下面的语句不能取得第4个时间段的开始和结束的TimeStamp.

[Quote=引用 6 楼 fredrickhu 的回复:]
SQL code
select * from tb t where =(select min(TimeStamp) from tb where value=t.value)
union all
select * from tb t where =(select max(TimeStamp) from tb where value=t.value)
[/Quote]
「已注销」 2010-11-13
  • 打赏
  • 举报
回复
自己看着修正,结构就是这样
select * from tb t
where not exists(select null from tb where t.value=value and t.TimeStamp<TimeStamp)
--小F-- 2010-11-13
  • 打赏
  • 举报
回复
select * from tb t where =(select min(TimeStamp) from tb where value=t.value)
union all
select * from tb t where =(select max(TimeStamp) from tb where value=t.value)
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
应该是连续相同的value 取得,开始 timestamp和结束的timestamp.
--小F-- 2010-11-13
  • 打赏
  • 举报
回复
貌似是相同value取时间最小的那个 对不?
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
其实就是得到 连续的同一个值的,一头一尾的时间值,即可
mnm0756 2010-11-13
  • 打赏
  • 举报
回复
上面的叙述有点问题.
其实这个类似股票的K线图.
得到的结果应该是
记录是按照TimeStamp排序的.
如上面的记录NULL 2010-11-12 17:57:58.000-- NULL 2010-11-12 17:59:18.000 连续的记录value都是Null,则得到
Null 2010-11-12 17:57:58.000
NULL 2010-11-12 17:59:18.000 这两个值
以此类推 1.50 2010-11-12 17:59:41.000 到1.50 2010-11-12 18:18:41.000
应该得到是
1.50 2010-11-12 17:59:41.000 和1.50 2010-11-12 18:18:41.000 这两个值
水族杰纶 2010-11-13
  • 打赏
  • 举报
回复
什么地方相同算相同?

34,593

社区成员

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

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