Sql server 使用t-sql选择删除重复值的数据集

Sql server 使用t-sql选择删除重复值的数据集,sql-server,tsql,Sql Server,Tsql,我在SQLServer2005中有一组表,其中包含timeseries数据。因此有一个datetime字段和一组值 CREATE TABLE [dbo].[raw_data]( [Time] [datetime] NULL, [field1] [float] NULL, [field2] [float] NULL, [field3] [float] NULL ) 不幸的是,datetime字段不是唯一的键,而且似乎有许多datetime值具有多个不相同的条目-因

我在SQLServer2005中有一组表,其中包含timeseries数据。因此有一个datetime字段和一组值

CREATE TABLE [dbo].[raw_data](
    [Time] [datetime] NULL,
    [field1] [float] NULL,
    [field2] [float] NULL,
    [field3] [float] NULL
)
不幸的是,datetime字段不是唯一的键,而且似乎有许多datetime值具有多个不相同的条目-因此DISTINCT不起作用

我想从这些表中选择数据,以便插入到一个新的、正确索引的表中

因此,我需要一个select查询,该查询每次返回一个带有单行条目的数据集。我不关心在给定时间内选择哪一组值,只要选择一个且仅选择一个

有很多这样的表,所以我没有时间查找和手动清除重复值,所以使用COUNT*>1查询的标准是不适用的。还有太多的重复项,无法完全忽略这些时间值


有什么想法吗?我在考虑基于分区的某种游标,但超出了这一点。

您不需要游标:

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

是的,这就是我要采取的方法。这不是完全忽略了重复的时间值,或者我误解了分区吗?@meepmeep:它会为每个不同的时间值返回一行:partitionby为每个不同的时间值创建一个窗口;ROW_NUMBER为每个分区内的每一行提供一个从1到N的升数;外部查询只返回行号为1的所有行,即每个分区的第一行。啊哈!我被误解了,这比我意识到的要有用得多。非常感谢。如果您想要一个基础t-sql,您可以使用:从dbo.rawdata中选择t.*作为t,从dbo.rawdata组中选择时间,将minfiled1作为C,按时间作为Ta,其中t.time=Ta.time,t.field1=Ta.field1