2012-03-06 8 views
1

I持って次のクエリT-SQLの最大値を取得

私は最大enterdateは、対応するCostIDと一緒だったが、私はMAX(B.CostID)を使用したくないものを見つける必要があり
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 

が、私はP.IDによってグループを持っているので、他のすべてのフィールドに何らかの集約が必要なので、私は を強制的に実行します。どのように私はP.IDによってグループを言い、最大(enterdate)を表示しますが、そのEnterdateに対応するCostIDを教えてください。

+0

uがいくつかのサンプルデータを投稿することができます両方のテーブルとあなたの希望のO/Pのための? – Teja

+1

ProtocolテーブルまたはBankテーブルのEnterdateですか? – 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 

OR

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

+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)の' 'Bank'に' 'Protocol''を組み込む必要がありますか? – 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 
関連する問題