2017-10-05 1 views
1

J'ai plusieurs tables que je me joins à une table qui ressemble à ceci:à des lignes répondant à des critères complexes certian

Date       Amount  pKey kID Source 
10/4/2017 11:00:01 AM  49.34   27  81  TT 
10/4/2017 10:49:29 AM  23.11   26  89  TT 
10/4/2017 11:45:20 AM  54.14   24  42  G 
10/4/2017 2:20:10 PM  10.20   26  89  G 

Les données proviennent dans les tables source à différents moments chaque jour. Ce que je veux faire est de créer une procédure ou quelque chose qui va "déplacer" certaines lignes. Si une ligne TT arrive après la dernière ligne G du jour, je veux déplacer la ligne TT au jour suivant (mais seulement quand elle a les mêmes pKey et kID que la dernière ligne G). Donc, dans le cas ci-dessus, je veux prendre la ligne numéro 4, et réinitialiser la date au 10/5/2017 XX: XX: XX, car il est entré après numéro de ligne 2 - qui a les mêmes pKey et KID. Je réalise que "last" et "after" sont des constructions relatives, mais j'espère que tout cela a du sens.

Comment puis-je atteindre cet objectif. Notez que la [Date] est sous forme de chaîne, donc une conversion sera probablement nécessaire.

+0

Il est utile d'étiqueter les questions de base de données à l'aide du logiciel approprié (MySQL, Oracle, DB2, ...) et de la version, par ex. 'sql-server-2014'. Les différences de syntaxe et de caractéristiques affectent souvent les réponses. Notez que 'tsql' rétrécit les choix, mais ne spécifie pas la base de données. – HABO

Répondre

1

Je pense que cela fait ce que vous voulez:

update t 
    set date = dateadd(day, 1, date) 
    where t.source = 'TT' and 
      t.date < (select max(t2.date) 
        from t t2 
        where t2.pkey = t.pkey and t2.kid = t.kid and 
          t2.source = 'G' and 
          cast(t.date as date) = cast(t2.date as date) 
        ); 

Il est à peu près une traduction directe de votre logique.

+0

Je pense qu'il pourrait y avoir un problème avec l'aliasing. J'ai remplacé le "t" avec mon nom de table dbo.Volumes et il a couru, mais il n'y avait pas de lignes affectées et je sais qu'il y a plusieurs lignes qui répondent aux critères. J'ai essayé d'exécuter l'instruction select dans la clause where et il dit que les colonnes t.pkey, t.kid et t.date ne pouvaient pas être liées ... (ce qui est supposé être le cas) êtes-vous sûr que l'alias est correct? – james5

+0

Mise à jour: Ahh, a couru une déclaration de sélection en utilisant la clause where et il est venu avec aucune ligne, on dirait que je dois faire des recherches sur ma fin. Peut-être que j'ai expliqué les mauvais critères – james5