2012-03-06 86 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组,并告诉我最大(enterdate),但给我那个Enterdate相应的CostID?

+0

ü可以发布一些示例数据对于这两个表和你想要的o/p? – Teja 2012-03-06 18:37:01

+1

是来自协议表还是银行表的Enterdate? – Taryn 2012-03-06 18:37:39

回答

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)'做了什么? mimer sql验证器给了我T031,“BOOLEAN数据类型”警告 - 它会和MAX(p.ENTERDATE)AS ENTERDATE'一样吗? – Aprillion 2012-03-06 19:09:16

+0

是的,它是一种别名列的方式。你可以用'MAX(p.ENTERDATE)AS ENTERDATE'替换它 – Akhil 2012-03-06 19:17:01

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

为什么你需要在Inner Query(MaxTable)中将'Protocol'加入'Bank'? – Akhil 2012-03-06 18:41:42

+0

哎呀,太多的复制和粘贴:)。固定 – 2012-03-06 18:57:17

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