2015-11-04 4 views
2

У меня есть таблица с идентификаторами контракта, которые имеют несколько значений.SQL Выбор из Sub Query

SELECT contractid 
    ,milestoneid 
    ,DATE 
    ,type 
    ,RANK() OVER (PARTITION BY contractid ORDER BY Milestoneid ASC) AS RankNbr 
FROM [TSWDATA].[dbo].t_milestone 
WHERE contractid = 1056229 


contractid milestoneid date  type    RankNbr 
1056  43269  10/10/15 Full    1 
1056  43449  10/26/15 GB     2 
1056  43456  10/26/15 Submit for Funding 3 
1056  43463  10/26/15 Cleared    4 

Мне нужно, чтобы присоединиться к основной таблице контракта и вытаскивать договор только тогда, когда значение «GB» является максимальным milestoneid.

Могу ли я сделать это в разделе where?

+0

(я удалил MySQL тег, так как это явно относится к MS SQL Server только) –

ответ

0

Если вам нужны записи из таблицы контрактов, вы можете присоединиться к вашему ранжированному запросу. Просто измените ваш заказ на DESC так RankNbr 1 будет максимальным milestoneid

SELECT * 
FROM [TSWDATA].[dbo].t_contract c 
JOIN (
    SELECT contractid 
     ,type 
     ,RANK() OVER (PARTITION BY contractid ORDER BY Milestoneid DESC) AS RankNbr 
    FROM [TSWDATA].[dbo].t_milestone 
) ms ON ms.contractid = c.contractid 
WHERE 
    --contractid = 1056229 AND 
    ms.RankNbr = 1 AND ms.type = 'GB' 
+0

JamieD77 - это прекрасно работает. Большое вам спасибо, – JDaves

0

Это работает для вас?

SELECT contractid 
     ,milestoneid 
    ,DATE 
    ,type 
    ,RANK() OVER (PARTITION BY contractid ORDER BY Milestoneid ASC) AS RankNbr 
FROM [TSWDATA].[dbo].t_milestone 
WHERE EXISTS (SELECT TOP (1) * 
       FROM SubTable AS s 
       WHERE s.type = 'GB' 
       AND s.contractID = [TSWDATA].[dbo].t_milestone.contractid 
       ORDER BY s.milestoneID DESC 
      ) 
    AND contractid = 1056229