Ordre de procédure stockée SQL Server lorsque deux valeurs ou plus entrent en conflit

Je construis une procédure stockée SQL Server (sur Sql Azure) Je suis capable de générer datatables pour l'exigence mais je ne suis pas en mesure de faire l'ordre, je n'ai aucune idée de la façon de le faire.

Ce qui suit est le résultat de la requête pour le moment (données randoms avec les colonnes nécessaires)

File | Description | DateOfFile | OrderOfLoad | BatchID --------+---------------+------------+-------------+--------- ABC.DOC | a description | 2016-07-12 | 2 | 10 DEF.PDF | a description | 2016-07-10 | 4 | 6 GHI.DOC | a description | 2016-07-12 | 2 | 3 XYZ.PDF | a description | 2016-07-10 | 1 | 7 WWW.XLS | a description | 2016-05-01 | 5 | 15 

Je dois d'abord order par date à partir du plus récent en premier ( order by DateOfFile DESC ), mais juste au cas où il y a deux files ou plus avec la même date (AAAAMMDD) l'ordre décide comme ceci: le dernier numéro BatchId et le premier numéro OrderOfLoad (juste s'il y a un conflit avec la date de deux ou plusieurs files), donc, pour l'exemple ici, l'ordre serait

  1. ABC.DOC … (l'autre partie de l'logging)
  2. GHI.DOC …
  3. XYZ.PDF …
  4. DEF.PDF …
  5. WWW.XLS …

J'apprécierais que l'un d'entre vous puisse me guider sur la manière d'accomplir cela, un bon pour ne pas affecter la performance, je pensais insert cela sur une table temporelle et ensuite faire une boucle (de preference pas de slider), mais pour l'instant je n'a pas d'idées.

Merci les gars.

Essayez ceci dans votre clause ORDER BY:

 ORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoad 

Comme je l'ai dit dans le commentaire précédent, vous pouvez avoir plusieurs colonnes dans l'ordre par, et la requête donnera la priorité de gauche à droite …

Donc, dans votre cas, si vous avez changé l'instruction à ORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoad il serait sortinger par DateOfFile , puis BatchId et enfin OrderOfLoad .

Toutefois, cela affichera le même nom de file s'il a été chargé deux fois le même jour. Si vous voulez afficher le dernier file de ce jour, vous pouvez utiliser Row_Number()

 WITH cteFiles AS ( SELECT [File] ,[Description] ,DateOfFile ,OrderOfLoad ,BatchID ,rn = ROW_NUMBER() OVER (PARTITION BY [file], DateOfFile ORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoad) FROM tablename ) SELECT [File] ,[Description] ,DateOfFile ,OrderOfLoad ,BatchID WHERE rn = 1 

En regardant votre tableau de files, il manque quelque chose.

Selon la suggestion de Sergio la requête vous donnera la sortie. Afin de le rendre plus robuste, vous pouvez créer un batchID unique et qui est lié à BatchDate afin que vous puissiez interroger pour get notre sortie plus efficacement.

J'espère que c'est ce que vous voulez.,

 select * from YourTable order by SUBSTRING(File,5,3),File