选择多列分组?

Jea*_*tin 4 sql sql-server-2008

有人可以帮我解决这个问题吗?

    SELECT CLIENT.ID_CLIENT ,
           EVALUATION_CLIENT.ID_EVAL ,
           MAX(EVALUATION_CLIENT.Date) AS DATE

FROM    EVALUATION_CLIENT

INNER JOIN CLIENT
    ON CLIENT.ID_CLIENT = EVALUATION_CLIENT.FK_IDClient

WHERE   EVALUATION_CLIENT.Date
            BETWEEN @START_DATE_LOCAL
            AND @END_DATE_LOCAL

GROUP BY    CLIENT.IDCLIENT,
            EVALUATION_CLIENT.ID_EVAL 
Run Code Online (Sandbox Code Playgroud)

它返回...

ID_CLIENT | ID_EVAL    | DATE_EVAL
1423      |11160       | 2008-02-12 00:00:00.000
1423      |11161       | 2008-02-18 00:00:00.000
18        |11162       | 2008-02-15 00:00:00.000
666       |11163       | 2008-02-19 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

但我想要的东西(没有重复的客户端)

ID_CLIENT | ID_EVAL    | DATE_EVAL
1423      |11161       | 2008-02-18 00:00:00.000
18        |11162       | 2008-02-15 00:00:00.000
666       |11163       | 2008-02-19 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

我使用的是MSSQL 2008

非常感谢 !

更新: Id_client需要最近日期的Id_Eval

mar*_*c_s 5

如果您只想要每个客户端的最新条目,您可以使用:

;WITH ClientEvals AS
(
    SELECT 
       c.ID_CLIENT ,
       e.ID_EVAL ,
       e.Date AS ClientDATE,
       ROW_NUMBER() OVER(PARTITION BY c.ID_CLIENT ORDER BY e.Date DESC) AS 'RowNo'
    FROM    
        dbo.EVALUATION_CLIENT e
    INNER JOIN 
        dbo.CLIENT c ON c.ID_CLIENT = e.FK_IDClient
    WHERE   
        e.Date BETWEEN @START_DATE_LOCAL AND @END_DATE_LOCAL
)
SELECT       
   ID_CLIENT ,
   ID_EVAL ,
   ClientDATE
FROM
   ClientEvals
WHERE
   RowNo = 1
Run Code Online (Sandbox Code Playgroud)

CTE内部的内部选择(公用表表达式)选择每个客户端的evals,并按以下方式对数据进行分区ID_Client- 每个客户端从1开始获取行号,其中1是最近的条目.

外部SELECT基于该CTE并且仅选择具有RowNo = 1- >每个客户端的最新行的那些行.