2012-03-06 6 views
1

У меня есть следующий запросT-SQL получить максимальное значение

SELECT P.ID, MAX(ENTERDATE) as ENTERDATE, MAX(B.CostID) as CostID 
    FROM Protocol P JOIN BANK B ON P.ID= B.ID         
    group by P.ID 

Мне нужно выяснить, что Макс enterdate был вместе с соответствующим CostID, но я не хочу использовать MAX (B.CostID), но Я вынужден сделать , так как у меня есть группа по P.ID, и все остальные поля должны иметь какой-то агрегат. Как я могу сказать группу по P.ID и показать мне max (enterdate), но дать мне соответствующий CostID для этого Enterdate?

+0

может у опубликовать некоторые данные выборки для обеих таблиц и ур желательно o/p? – Teja

+1

Входит в таблицу протокола или таблицу Банка? – Taryn

ответ

3
SELECT P.ID, 
     ENTERDATE = MAX(p.ENTERDATE), 
     CostID  = (SELECT CostID FROM Bank WHERE ID = p.ID) 
    FROM Protocol P     
    group by P.ID 

или что-то вроде

SELECT t.*, 
     CostID 
    FROM Bank b 
     JOIN (
       SELECT P.ID, 
         ENTERDATE = MAX(p.ENTERDATE) 
        FROM Protocol P     
        group by P.ID     
      ) t ON t.ID = b.ID 
+0

Что делает 'ENTERDATE = MAX (p.ENTERDATE)' do? mimer sql validator дал мне T031, предупреждение типа «BOOLEAN» - будет ли оно делать так же, как «MAX (p.ENTERDATE) AS ENTERDATE'? – Aprillion

+0

Да, это способ слияния столбцов. Вы можете заменить его на «MAX (p.ENTERDATE) AS ENTERDATE' – Akhil

1

Почему не подзапрос его:

SELECT MaxTable.*, BANK.CostID AS CostID 
FROM 
(
    SELECT P.ID, MAX(ENTERDATE) AS ENTERDATE 
    FROM Protocol P         
    GROUP BY P.ID 
) AS MaxTable 
JOIN BANK 
    ON MaxTable.ID = BANK.ID 
+0

, почему вам нужно присоединиться к« Протоколу »к« Банку »во внутреннем запросе (MaxTable)? – Akhil

+0

Упс, слишком много копировать и вставлять :). Исправлена –

0

Вы можете попробовать с аналитической функцией ROW_NUMBER:

SELECT * 
FROM 
    (SELECT p.id, p.enterdate, b.costid, 
     ROW_NUMBER() OVER(PARTITION BY p.id ORDER BY p.enterdate DESC) AS rownum 
    FROM Protocol P JOIN BANK B ON P.ID= B.ID) 
WHERE rownum = 1 
Смежные вопросы