2015-08-07 7 views
1

У меня есть сценарий, в котором я бы хотел вернуть 3 столбца, получив максимальную запись в SQL Server. как нижеПолучить максимальную запись в T-SQL

ID PID  PDATE      Satus CANUMBERS 
    1 PS1  2015-08-05 12:20:49.627 0 1  CAA0322 
    2 PS2  2015-08-06 04:05:52.053 0 1  CAA0322 
    3 PS2  2015-08-07 07:17:32.653 1 1  CAA0322 

в этом случае то, что я искал получает максимальное PDate каждого PID, как последняя запись ИЗОДРОМНЫХ введенного во все времена.

Я попытался следующие:

SELECT 
    MAX(ID), PID, PDATE 
FROM 
    TABLE1 
GROUP BY 
    PID, PDATE ... 

Проблема группировки бновить, он возвращает все записи. я хочу только максимальную бновить для каждого PID, как

1 PS1  2015-08-05 12:20:49.627 0 1  CAA0322 
3 PS2  2015-08-07 07:17:32.653 1 1  CAA0322 

любой помощи, пожалуйста,

ответ

3

Вы должны использовать КТР с функцией в ROW_NUMBER() взвешивания - что-то вроде этого:

;WITH CTE AS 
(
    SELECT 
     ID, PID, PDATE, Satus, CANUMERS, 
     RowNum = ROW_NUMBER() OVER (PARTITION BY PID ORDER BY PDATE DESC) 
    FROM 
     dbo.YourTable 
) 
SELECT 
    ID, PID, PDATE, Satus, CANUMERS 
FROM 
    CTE 
WHERE 
    RowNum = 1 

Предложения PARTITION BY разделяет ваши данные по столбцу PID, а затем номера каждого раздела, начиная с 1 - так что строка с RowNum = 1 - это последние строка (заказывается по PDATE убыванию - сначала новые) для каждого PID

+0

можно ли присоединиться к этому всему заявлению в другую таблицу, можно сказать, что table2 имеет PID, Books, Author ... и я хочу получить книги, записи авторов, присоединившись к PID вышеуказанного утверждения? – Bels

+1

@Bels: да конечно - просто добавьте 'INNER JOIN' в' SELECT .. FROM CTE .... '- это просто регулярное заявление T-SQL, ничего волшебного или безумного в этом ... –

1

Использование ROW_NUMBER() функции для достижения выхода:

create table maxrecord 
    (
    id int, 
    PID varchar(10), 
    pdate datetime, 
    statuss int, 
    CANUMBERS varchar(10)) 


    insert into maxrecord values(1,'PS1','2015-08-05 12:20:49.627',1,'CAA0322'), 
           (2,'PS2','2015-08-06 04:05:52.053',1,'CAA0322'), 
           (3,'PS2','2015-08-07 07:17:32.653',1,'CAA0322') 



;WITH CTE as 
(
select row_number() over (partition by PID order by PDATE DESC) as ROWNUM ,* from maxrecord 
) 
select id , 
     PID , 
     pdate, 
    statuss , 
    CANUMBERS 
    from CTE where ROWNUM=1 
0

Другой, потенциально проще пример, чем КТР и оконных функций, было бы просто присоединиться к вашей макс группировки в подзапрос, возвращая только совпадающие строки, например:

SELECT * 
FROM TABLE1 T1 
JOIN 
    (SELECT MAX(ID) ID, MAX(PDATE) PDATE, PID -- Listing PID here is unnecessary, but makes the query easier to understand 
    FROM TABLE1 
    GROUP BY PID) SRC 
     ON SRC.ID = T1.ID AND SRC.PDATE = T1.PDATE 

в действии в SQLFiddle, here.

Но, что, если есть две записи, привязанные к максимальной дате? Вы хотите только один (т. Е. Последний идентификатор) или ВСЕ записи, привязанные к максимальному?

Если вы хотите использовать галстуки, измените вместо этого выбор.

SELECT * 
FROM TABLE1 T1 
JOIN 
    (SELECT MAX(PDATE) PDATE, PID 
    FROM TABLE1 
    GROUP BY PID) SRC 
     ON SRC.PDATE = T1.PDATE AND SRC.PID = T1.PID