2010-10-21 4 views
2

J'ai un ensemble de tables dans SQL Server 2005 qui contient des données de timesérie. Il y a donc un champ datetime et un ensemble de valeurs.Utilisation de t-sql pour sélectionner un dataset avec des valeurs dupliquées supprimées

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

Le champ datetime est malheureusement pas une clé unique, et il semble y avoir beaucoup de valeurs datetime avec de multiples entrées (non identiques) - d'où DISTINCT ne fonctionne pas.

Je souhaite sélectionner les données de ces tables pour les insérer dans une nouvelle table correctement indexée.

Par conséquent, je veux une requête de sélection qui retournera un ensemble de données avec une entrée de ligne unique pour chaque fois. Je ne suis pas concerné quel ensemble de valeurs est choisi pour un temps donné, tant qu'un (et un seul) est choisi.

Il y a beaucoup de ces tables, donc je n'ai pas le temps de trouver et de purger manuellement les valeurs dupliquées, donc une requête HAVING COUNT (*)> 1 standard n'est pas applicable. Il y a aussi trop de doublons pour simplement ignorer complètement ces valeurs de temps.

Des idées? Je pensais à une sorte de curseur basé sur PARTITION BY, mais je suis resté coincé au-delà de ce point.

+0

Si vous voulez un t-sql base vous pouvez utiliser: sélectionnez T. * de dbo.rawdata comme T, (sélectionner l'heure, min (filed1) comme C de dbo.rawdata groupe par le temps) comme Ta où t.time = ta.time et t.field1 = ta.field1 – Ice

Répondre

4

Vous n'avez pas besoin d'un curseur:

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

Yup, c'est le genre d'approche que je prendrais. –

+0

N'est-ce pas simplement ignorer complètement les valeurs de temps en double, ou est-ce que je ne comprends pas PARTITION? – meepmeep

+0

@meepmeep: Il retourne une seule ligne pour chaque valeur 'Time' distincte:' PARTITION BY' crée une "fenêtre" pour chaque valeur 'Time' distincte; 'ROW_NUMBER' donne à chaque ligne dans chaque partition un nombre croissant de 1 à * N *; la requête externe renvoie simplement toutes les lignes où le numéro de ligne est * 1 * (c'est-à-dire la première ligne de chaque partition). – LukeH