获取最大值的不同记录

时间:2015-12-30 09:11:38

标签: sql sql-server-2008

我有这样的查询:

SELECT distinct(A.EMP_ID), C.MAINT_ID 
FROM EMPLOYEE_MASTER A   
LEFT OUTER JOIN DESIGNATION_MAINTENANCE C ON A.EMP_ID = C.EMP_ID 

返回以下输出。

EMP_ID  |MAINT_ID
----------------
15       NULL
16       NULL
17       NULL
18       1
18       2
18       3
19      NULL
20      NULL
21      4
21      5
22      NULL
23      NULL

现在我需要的实际结果是

  • 获取Emp _id的maint_id最大值并仅显示最大记录。

例如,对于Emp_id 18,有三条记录。但我需要最大的一个,即maint_id = 3

所以我期望的输出就像

EMP_ID  MAINT_ID
------------------    
15  NULL
16  NULL
17  NULL
18  3
19  NULL
20  NULL
21  5
22  NULL
23  NULL

到目前为止我尝试过的是

SELECT 
    (A.EMP_ID), C.MAINT_ID 
FROM 
    EMPLOYEE_MASTER A   
LEFT OUTER JOIN 
    DESIGNATION_MAINTENANCE C ON A.EMP_ID = C.EMP_ID 
                              AND C.MAINT_ID = (SELECT TOP(1) MAINT_ID 
                                                FROM DESIGNATION_MAINTENANCE   
                                                ORDER BY MAINT_ID DESC)

返回:

EMP_ID  MAINT_ID
------------------
15  NULL
16  NULL
17  NULL
18  NULL
19  NULL
20  NULL
21  5
22  NULL
23  NULL

这不是我的期望。怎么做?任何帮助表示赞赏

2 个答案:

答案 0 :(得分:1)

您可以简单地使用MAX并在以下内容中添加GROUP BY子句:

SELECT (A.EMP_ID)
       ,MAX(C.MAINT_ID ) MAINT_ID
FROM EMPLOYEE_MASTER A   
LEFT OUTER JOIN DESIGNATION_MAINTENANCE C ON A.EMP_ID = C.EMP_ID 
GROUP BY A.EMP_ID

或者如果你想在子查询中使用这个糟糕的解决方案,请尝试以下方法:

SELECT (A.EMP_ID)
       ,C.MAINT_ID 
FROM EMPLOYEE_MASTER A   
LEFT OUTER JOIN DESIGNATION_MAINTENANCE C ON A.EMP_ID = C.EMP_ID AND 
                C.MAINT_ID =(select top(1) MAINT_ID from DESIGNATION_MAINTENANCE C1 WHERE C.EMP_ID = C1.EMP_ID ORDER BY MAINT_ID DESC)

答案 1 :(得分:0)

试试这个:

SELECT (A.EMP_ID)
  ,C.MAINT_ID FROM 
                 EMPLOYEE_MASTER A LEFT OUTER JOIN 
(SELECT EMP_ID, MAX(MAINT_ID) AS MAINT_ID FROM DESIGNATION_MAINTENANCE GROUP          BY EMP_ID) C 
                 ON A.EMP_ID = C.EMP_ID 
                 ;