2010-10-31 8 views
2

j'ai une table d'événements avec les colonnes suivantes:Ajout d'une donnée de référence à la colonne de table à partir de différentes lignes de la table

    séquence
  • (int)
  • DeviceID (varchar (8))
  • de TIME_START (datetime)
  • DeviceState (smallint)
  • TIME_END (datetime)

Toutes les colonnes sauf time_end sont remplies avec les données (ma colonne time_end actuelle est NULL à travers la table). Ce que je dois faire est de remplir la colonne time_end avec les données de fermeture d'événement. C'est en fait le moment où un nouvel événement du même périphérique s'est produit. Voici un exemple modèle de données comment il devrait fonctionner à la fin:

sequence  DeviceID   time_start   DeviceState  time_end 
-------------------------------------------------------------------------------------- 
1   000012A7   2010-10-31 12:00  14    2010-10-31 12:10 
2   000012A7   2010-10-31 12:10  18    2010-10-31 12:33 
3   000012A8   2010-10-31 12:20  16    2010-10-31 13:01 
4   000012A7   2010-10-31 12:33  13    2010-10-31 12:47 
5   000012A7   2010-10-31 12:47  18    2010-10-31 13:20 
6   000012A8   2010-10-31 13:01  20    2010-10-31 13:23 
7   000012A7   2010-10-31 13:20  05    2010-10-31 14:12 
8   000012A8   2010-10-31 13:23  32    2010-10-31 14:15 
9   000012A7   2010-10-31 14:12  12 
10   000012A8   2010-10-31 14:15  35 

L'idée est que pour chaque enregistrement dans le tableau que je dois sélectionner un enregistrement sur la séquence plus élevée pour le dispositif spécifique et mettre à jour le TIME_END avec les données time_start de cet enregistrement de niveau supérieur. Avec ceci, je serai en mesure de suivre la période de chaque événement.

Je pensais à faire cela avec un appel de fonction, mais j'ai deux principales difficultés: 1. obtenir les données, par exemple: séquence = 2 et la mise à jour de la séquence TIME_END = 1 2. la création d'une fonction qui sera Continuez en même temps que de nouveaux enregistrements sont ajoutés dans la table

Je suis assez nouveau dans le SQL et je suis complètement perdu sur ce qui est possible. Sur la base de mes connaissances, je devrais utiliser la fonction qui référencerait les données ensemble, mais mes connaissances actuelles me limitent en faisant cela.

J'espère que quelqu'un pourrait me fournir quelques conseils dans quelle direction aller et me fournir des commentaires si je suis sur la bonne voie ou non. Tout article de support serait très apprécié.

+1

Pour quelle version de SQL Server? Si time_end sera toujours le précédent time_start, pourquoi l'enregistrer du tout - ce sont des données redondantes que vous pourriez obtenir en sélectionnant le time_start pour un deviceid et un ordre avec la valeur time_start ... –

+0

Pour ajouter à ce que les poneys OMG suggèrent si c'est un Pour éviter d'écrire cette logique encore et encore parce que vous prévoyez de l'utiliser fréquemment, vous pourriez créer une vue. –

+0

@OMG Ponies: SQL Server 2008 – Mark

Répondre

0

Vue:

CREATE VIEW tableview AS 
with timerank AS 
(
SELECT mytable.*, ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY time_start) as row 
FROM THE_TABLE mytable 
) 
SELECT tstart.*, tend.time_start AS time_end 
FROM timerank tstart 
    LEFT JOIN timerank tend ON tstart.row = tend.row - 1 
    AND tstart.DeviceID = tend.DeviceID 

Edit: Je vois vos besoins deviceid maintenant.

+0

merci Mootinator.Je vais tester votre méthode et vous faire savoir comment cela fonctionne. – Mark

0

@OMG Ponies: Je pense ici sera un peu mieux la mise en forme:

MISE À JOUR YOUR_TABLE SET TIME_END = (SELECT TOP 1 t.time_start DE YOUR_TABLE t OÙ t.DeviceID = YOUR_TABLE.DeviceID ET t.time_start> YOUR_TABLE.time_start ORDER BY t.time_start ASC)

+0

L'erreur dans la publication OMG était en première ligne, puis lors de l'instruction SELECT, t.time_start devrait être plus grande que time_start de l'enregistrement en cours, en plus nous devons ordonner les enregistrements en format ascendant. – Mark

Questions connexes