Выбрать несколько столбцов Группировать по одному? - PullRequest
4 голосов
/ 20 апреля 2011

Может ли кто-нибудь помочь мне с этим запросом?

    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_Eval для самой последней даты от Id_client

Ответы [ 3 ]

5 голосов
/ 20 апреля 2011

Если вы хотите только самую последнюю запись для каждого клиента, вы можете использовать:

;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 (Common Table Expression) выбирает evals для каждого клиента и разбивает данные на ID_Client - каждый клиент получает номера строк от 1 и выше, причем 1 - самая последняя запись.

Внешний SELECT основан на этом CTE и выбирает только те строки с RowNo = 1 -> самыми новыми для каждого клиента.

2 голосов
/ 20 апреля 2011

Вы можете сделать следующее, если вы хотите только самый высокий ID_EVAL для ID_CLIENT:

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
0 голосов
/ 20 апреля 2011

Этот подход учитывает случай MAX(ID_EVAL) не в той же строке, что и MAX(EVALUATION_CLIENT.Date)

Если вам не нужно беспокоиться об этом условии, используйте подход Одеда.

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...