2016-10-08 75 views
0

帮助我是编程新手,我需要获取每个EXE名称的最高版本数据。我发现了同样的文章,但我们有不同的表格结构,所以他们没有真正帮我解决我的问题。
我有这个表:INNER JOIN MAX函数

表mForm

FormID  FormName   EXEname  CurrentVersion 
-------------------------------------------------------- 
BTC-01  CASH REVIEW  BTC-01.EXE 1.0.2.5 
BTC-02  CASH REQUEST BTC-02.EXE 1.1.2.4 
BTC-03  PAYMENTS  BTC-03.EXE 1.0.0.3 

表mVersionHistory

EXEname   FormName  Version  ReleasedDate ReleaseDescription 
----------------------------------------------------------------------------- 
BTC-01.EXE  CASH REVIEW  1.0.2.5  08-08-16  IT REQ 10063 
BTC-01.EXE  CASH REVIEW  1.0.2.4  08-08-10  IT REQ 10051 
BTC-01.EXE  CASH REVIEW  1.0.2.3  08-08-09  IT REQ 10050 
BTC-02.EXE  CASH REQUEST 1.1.2.4  08-08-13  IT REQ 10003 
BTC-02.EXE  CASH REQUEST 1.1.2.0  08-08-10  IT REQ 10002 
BTC-03.EXE  PAYMENTS  1.0.0.2  08-08-07  IT REQ 10102 
BTC-03.EXE  PAYMENTS  1.0.0.1  08-08-06  IT REQ 10092 

我想回到与T不同的数据他是最高版本。 这样的:

EXEname   FormName  CurrentVersion Version  ReleasedDate ReleaseDescription 
---------------------------------------------------------------------------------------------- 
BTC-01.EXE  CASH REVIEW  1.0.2.5   1.0.2.5  08-08-16  IT REQ 10063 
BTC-02.EXE  CASH REQUEST 1.1.2.4   1.1.2.4  08-08-13  IT REQ 10003 
BTC-03.EXE  PAYMENTS  1.0.0.3   1.0.0.2  08-08-07  IT REQ 10102 

我可以用我的代码做到这一点,但问题是,我不能添加描述和RELEASEDATE列,每次我加入他们的时候,所有的数据将显示出来,因为他们有不同的数据在Description和ReleaseDate列中。

SELECT 
A.FormID [FORM ID] 
, A.FormName [FORM NAME] 
, A.ExeName [EXE NAME] 
, A.CurrentVersion [CURRENT VERSION] 
, B.RVersion AS [RELEASED VERSION] 
FROM 
mForm A 
INNER JOIN 
(SELECT Exename, MAX(Version) AS RVersion 
FROM mVersionHistory 
GROUP BY ExeName) B 
ON A.ExeName = B.ExeName 
GROUP BY A.FormID, B.FormName, A.CurrentVersion, B.RVersion, A.ExeName 


我应该在哪里添加描述和RELEASEDATE列? 感谢

+0

表mForm已经有最新版本的每个应用程序的,对不对? – qxg

+0

@qxg是的,他们有最新版本 –

+0

然后,我没有得到你为什么'MAX'版本了。 – qxg

回答

0

应用可以使用ROW_NUMBER窗函数

;WITH cte 
    AS (SELECT A.formid     [FORM ID], 
       A.formname     [FORM NAME], 
       A.exename     [EXE NAME], 
       A.currentversion   [CURRENT VERSION], 
       B.rversion     AS [RELEASED VERSION], 
       ---You can add whatever columns need from mversionhistory table 
       Row_number()OVER(partition BY A.exename ORDER BY b.version DESC) AS Rn 
     FROM mform A 
       INNER JOIN mversionhistory B 
         ON A.exename = B.exename) 
SELECT * 
FROM cte 
WHERE rn = 1 
+0

这实际上就是我刚才所做的,但谢谢 –

0

可以跨在以后版本的SQL

SELECT 
A.FormID [FORM ID] 
, A.FormName [FORM NAME] 
, A.ExeName [EXE NAME] 
, A.CurrentVersion [CURRENT VERSION] 
, c.RVersion AS [RELEASED VERSION] 
FROM 
mForm A 
cross apply 
(SELECT top 1 Exename, Version AS RVersion 
FROM mVersionHistory B 
where A.ExeName = B.ExeName and a.FormName = b.FormName 
order by version desc) c 
+0

如果我有适当的索引,我会采用这种方法 –