选择多列进行分组,只按一个列进行分组?

4
能否有人帮我处理这个查询?
    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 

它返回的是...

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

但是我需要像(无重复客户)这样的东西。
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

我使用的是 MSSQL 2008 数据库

非常感谢!

更新:我需要按照 Id_client 分组并找出最近日期的 Id_Eval。


你只是想要每个客户端最高的ID_EVAL吗?还是你想要最新日期的ID_EVAL?这两者在定义上是一样的吗? - Dave Costa
3个回答

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

CTE(公共表达式)内部的选择为每个客户选择评估,并根据ID_Client对数据进行分区 - 每个客户从1开始获取行号,其中1是最新条目。

外部SELECT基于该CTE,并仅选择具有RowNo = 1的行 ->每个客户的最新行。


这正是我想要做的!谢谢。 - Jean-Christophe Fortin

2
如果您只想获取一个ID_CLIENT的最高ID_EVAL,则可以执行以下操作:
SELECT CLIENT.ID_CLIENT ,
           MAX(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

请注意,这可能会返回一行中的ID_EVAL和另一行中的Date。这可能是可以接受的,因为发布者对要求不清楚 - 但更有可能的是他们希望从同一行中获取两个元素。如果可以保证较高的ID_EVAL也将具有较晚的Date,那么在任何情况下都可以接受这种情况。 - Dave Costa
@Dave - 确实如此。需要更多来自OP的信息才能确定。 - Oded

0

这种方法将允许在 MAX(ID_EVAL) 不在同一行时使用 MAX(EVALUATION_CLIENT.Date)

如果您不必担心这种情况,请使用Oded的方法。

SELECT CLIENT.ID_CLIENT ,
       EVALUATION_CLIENT.ID_EVAL ,
       EVALUATION_CLIENT.Date
FROM   evaluation_client 
       INNER JOIN client 
         ON client.id_client = evaluation_client.fk_idclient 
       INNER JOIN (SELECT client.id_client, 
                          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.id_client, 
                             evaluation_client.id_eval)maxdate 
         ON evaluation_client.DATE = maxdate.DATE 
            AND client.id_client = maxdate.id_client 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接