我有一个庞大的表,我正在尝试在MS SQL Server Management Studio中瘦身。目前,每5秒数据就有一行。我想收缩表,每30分钟只保存1行。
例如,而不是在
处有数千行 Timestamp A B C
2015-01-01 00:00:00 1 5 6
2015-01-01 00:00:05 5 7 1
2015-01-01 00:00:10 2 2 3
2015-01-01 00:00:15 2 1 0
......
2015-04-10 13:55:55 4 5 6
2015-04-10 13:56:00 6 4 2
我想把它稀释掉,所以我只有
Timestamp A B C
2015-01-01 00:00:00 1 5 6
2015-01-01 00:30:00 2 5 7
2015-01-01 01:00:00 1 7 6
......
2015-04-10 13:30:00 4 5 6
2015-04-10 14:00:00 6 4 2
谢谢!
答案 0 :(得分:3)
根据您的样本数据,您可以这样做:
select t.*
from table t
where datepart(minute, timestamp) in (0, 30) and
datepart(second, timestamp) = 0;
答案 1 :(得分:0)
delete from [massive Table] where datepart(mi,timestamp) not in (0,30)
将删除与您的条件不符的所有行。
答案 2 :(得分:0)
如果您的时间不是0或5,那么您可以尝试这样做。
Delete
From YourTable
Where DateDiff(Second, '20000101', TimeStamp) % 1800 > 4
这可以通过计算自2000年1月1日以来已过期的秒数来实现.mod运算符用于计算您想要保留的间隔。 30分钟内有1800秒。因此,应删除秒数大于4的任何内容。基本上,我们不是考虑小时,分钟和秒的时间,而是考虑1800秒间隔的时间,这就是你想要的。
答案 3 :(得分:0)
从一组行中选择一行时,编写依赖于可能不正确的假设的代码并不总是一个好主意。例如,当查找小时和半小时的第一个条目时,是否保证始终存在带有时间戳的条目" hh-00-00"和" hh-30-00"?您的示例数据显示,但这是否以这种方式准确地表示您的实际数据?
您可能想要说的是,您希望在每小时和半小时的边界之后保留"第一个条目。"这样,你知道你每半小时间隔会有一个条目,即使第一个条目是在一小时或半小时后两秒钟进入。
所以第一步是将日期分成半小时组。我发现这样做的最好方法是
Convert( SmallDatetime, Floor( Cast( Timestamp AS float ) * 48.0 ) / 48.0 )
在查询列表的末尾添加并查看是否正确的时间(向下舍入到完全在小时或正好在半小时)。特别注意非常接近(边界之前和之后)的时间。
使用它,可以很容易地生成每半小时增量中首次出现的时间列表。您不必担心每个增量都有一个与半小时边界匹配的条目。加入即可获得完整的行列表。删除所有其余的。
with
Halfs( HalfHour )as(
select Min( Timestamp )
from TData
group by Convert( SmallDatetime, Floor( Cast( Timestamp AS float ) * 48.0 ) / 48.0 )
)
select t.*
from TData t
join Halfs h
on h.HalfHour = t.TimeStamp;