2010-10-21 77 views
2

我在SQL Server 2005中有一组包含时间序列数据的表。因此有一个日期时间字段和一组值。使用t-sql选择删除重复值的数据集

CREATE TABLE [dbo].[raw_data](
    [Time] [datetime] NULL, 
    [field1] [float] NULL, 
    [field2] [float] NULL, 
    [field3] [float] NULL 
) 

的时间字段是不幸的是没有一个独特的密钥,似乎有很多的日期时间值的多(不相同)项 - 因此DISTINCT不起作用。

我想从这些表中选择数据以插入新的,正确索引的表格中。

因此,我想要一个选择查询,它将为每个时间返回一个单一行条目的数据集。只要选择一个(并且只有一个),我不关心在给定时间内选择哪组值。

这些表格很多,所以我没有时间查找和手动清除重复值,因此标准的HAVING COUNT(*)> 1查询不适用。也有太多的重复,只是完全忽略这些时间值。

任何想法?我正在考虑基于PARTITION BY的某种类型的游标,但是超出了这一点。

+0

如果你想有一个基础的T-SQL,您可以使用: 选择T. * 从dbo.rawdata为T,(选择时间,分钟(filed1)作为C从 dbo.rawdata组按时间)为Ta 其中t.time = ta.time 和t.field1 = ta.field1 – Ice 2010-10-22 22:40:36

回答

4

你不需要光标:

SELECT tmp.* 
FROM 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY [Time] ORDER BY [Time]) AS RowNum 
    FROM raw_data 
) AS tmp 
WHERE tmp.RowNum = 1 
+0

是的,这是我会采取的方法。 – 2010-10-21 09:25:09

+0

这不就是完全忽略重复的时间值,还是我误解PARTITION? – meepmeep 2010-10-21 09:29:57

+0

@meepmeep:它会为每个不同的'Time'值返回一行:'PARTITION BY'为每个不同的'Time'值创建一个“窗口”; 'ROW_NUMBER'给每个分区内的每一行从1到* N *的升序数;外部查询只返回行号为* 1 *的所有行(即每个分区的第一行)。 – LukeH 2010-10-21 09:39:34