Sélection du numéro de version maximum de deux colonnes
-
11-10-2019 - |
Question
Cela se rapporte à une autre question que je posais précédemment. Vous pouvez avoir une meilleure compréhension de ce si vous analysez rapidement. flottent numéros de version, décimal ou le double
J'ai deux et un étranger colums dans une table de base de données. [Version] et la colonne [Révision] colonne. 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 maximale pour une clé étrangère particulière.
Voici ce que j'ai à ce jour:
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 obvisouly pas de travail parce que si je les numéros de version 1.1
, 1.2
et 2.0
la valeur maximale Je retourne 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électionnez le maximum [Révision] pour que [version], mais je ne peux pas tout à fait figure comment faire.
Toute aide, suggestions, questions sont les bienvenus.
Merci.
La solution
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, même pour récupérer l'enregistrement.
Autres conseils
Le ci-dessous devrait fonctionner pour extraire la révision du dessus.
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 extrait uniquement les enregistrements en utilisant la version max dans la table x. Ensuite, il ordonne à ces dossiers par la révision dans l'ordre décroissant, et extrait le plus élevé du groupe.