2010-11-16 15 views
3

Cela concerne une autre question que j'ai posée précédemment. Vous pouvez avoir une meilleure compréhension de cela si vous le numérisez rapidement. Version Numbers float, decimal or doubleSélection du nombre maximal de versions à partir de deux colonnes

J'ai deux colonnes et un étranger dans une table de base de données. Une colonne [Version] et une colonne [Revision]. Ceux-ci sont en relation avec les numéros de version. par exemple. Version 1, Révision 2 = v1.2

Ce que je dois faire est de saisir le numéro de version maximum pour une clé étrangère particulière.

Voici ce que j'ai jusqu'à présent:

SELECT f.[pkFileID] 
    ,x.[fkDocumentHeaderID] 
    ,f.[fkDocumentID] 
    ,x.[Version] 
    ,x.[Revision] 
    ,f.[FileURL] 
    ,f.[UploadedBy] 
    ,f.[UploadedDate] 
FROM 
(
    SELECT 
    docs.[fkDocumentHeaderID] 
    ,MAX([Version]) AS Version 
    ,MAX([Revision]) AS Revision 
FROM 
    [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles] 
INNER JOIN 
    dbo.tbl_Documents docs ON [fkDocumentID] = [pkDocumentID] 
GROUP BY 
    docs.[fkDocumentHeaderID] 
) 
AS x 
INNER JOIN 
dbo.tbl_DocumentFiles f ON 
f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] AND 
f.[Version] = x.[Version] AND 
f.[Revision] = x.[Revision] 

En fait saisir le maximum et rejoindre à lui-même. Cela ne fonctionne pas parce que si j'ai les numéros de version 1.1, 1.2 et 2.0 la valeur maximale que je reviens de la requête ci-dessus est 2.2 (qui n'existe pas). Ce que je dois faire (je pense) est de sélectionner le maximum [Version], puis sélectionner le maximum [Révision] pour cela [Version] mais je n'arrive pas à comprendre comment faire cela.

Toute aide, suggestion, question sont les bienvenues.

Merci.

Répondre

2

Vous pouvez changer à

SELECT f.[pkFileID] 
     ,x.[fkDocumentHeaderID] 
     ,f.[fkDocumentID] 
     ,x.[Version] 
     ,x.[Revision] 
     ,f.[FileURL] 
     ,f.[UploadedBy] 
     ,f.[UploadedDate] 
FROM (
      SELECT docs.[fkDocumentHeaderID] 
        ,MAX([Version] * 100000 + [Revision]) AS [VersionRevision] 
      FROM [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles] 
        INNER JOIN dbo.tbl_Documents docs 
        ON [fkDocumentID] = [pkDocumentID] 
      GROUP BY 
        docs.[fkDocumentHeaderID] 
     )AS x 
     INNER JOIN dbo.tbl_DocumentFiles f 
      ON f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] 
      AND f.[Version] * 100000 + f.[Revision] = x.[VersionRevision] 

L'idée est de multiplier la version avec une assez grande constante de sorte qu'il n'entre en collision avec la révision (j'ai pris 100.000 mais toute valeur serait faire). Après cela, votre JOIN fait de même pour récupérer l'enregistrement.

+0

Fonctionne parfaitement, merci. – Jamie

0

Ce qui suit devrait fonctionner pour extraire la révision supérieure.

SELECT TOP 1 f.[pkFileID] 
    ,x.[fkDocumentHeaderID] 
    ,f.[fkDocumentID] 
    ,x.[Version] 
    ,x.[Revision] 
    ,f.[FileURL] 
    ,f.[UploadedBy] 
    ,f.[UploadedDate] 
FROM 
(
    SELECT 
    docs.[fkDocumentHeaderID] 
    ,MAX([Version]) AS Version 
    -- Comment this out ,MAX([Revision]) AS Revision 
FROM 
    [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles] 
INNER JOIN 
    dbo.tbl_Documents docs ON [fkDocumentID] = [pkDocumentID] 
GROUP BY 
    docs.[fkDocumentHeaderID] 
) 
AS x 
INNER JOIN 
dbo.tbl_DocumentFiles f ON 
f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] AND 
f.[Version] = x.[Version] 
ORDER BY x.Revision DESC 

A savoir, il n'extrait que les enregistrements utilisant la version max dans la table x. Ensuite, il ordonne ces enregistrements par révision dans l'ordre décroissant, et extrait le plus haut de la grappe.

+0

Cette requête renvoie uniquement 1 résultat, au lieu du premier résultat pour toutes les clés étrangères. Pas tout à fait ce que je cherchais mais merci pour l'aide. – Jamie