2016-05-26 16 views
5

मेरे पास दो टेबल हैं, एक "मास्टर" नामों की एक मास्टर सूची है और दूसरा "परिदृश्य" मास्टर सूची से प्रत्येक नाम के लिए एकाधिक परिदृश्यों की एक सूची है । मैं अपने INNER JOIN क्वेरी को "परिदृश्य" तालिका से कॉलम स्थिति के साथ आईडी की मास्टर सूची लाने के लिए चाहता हूं लेकिन केवलदृश्य आईडी के आधार पर सबसे हाल की स्थिति चाहता हूं। यहाँ कोड है कि मैं कोशिश की है और वांछित उत्पादन के साथ टेबल हैSQL स्तंभ किसी अन्य कॉलम से अधिकतम मान के आधार पर कॉलम पर शामिल होता है

SELECT DISTINCT a.[user], a.ID, a.Name, b.status 
from master a 
INNER JOIN scenario b ON a.ID = b.ID 
WHERE 
    b.scenarioID = (
      SELECT max(scenarioID) FROM scenario c2 WHERE c2.ID=c.ID) 

मास्टर

ID user Name 
425 John Skyline 
426 John Violin 
427 Joe  Pura 

परिदृश्य

ID ScenarioID status 
425 1    active 
425 2    active 
425 3    done 
426 1    active 
426 2    active 
427 1    done 

वांछित उत्पादन

ID user Name status 
425 John Skyline done 
426 John Violin active 
427 Joe  Pura done 
+0

http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group तो वहाँ समस्या को हल करने के विभिन्न तरीके हैं mysql नहीं एसक्यूएल सर्वर के लिए है। इसके अलावा इस प्रश्न में अंतिम रिकॉर्ड में शामिल होना शामिल है जबकि डुप्लिकेट प्रश्न सिर्फ एक तालिका के भीतर अंतिम प्राप्त करने की कोशिश कर रहा है। –

उत्तर

1

यहाँ एक अलग सूत्रीकरण एक CTE है, जो मैं आम तौर पर लगता है (हालांकि निश्चित रूप से, अपने लाभ भिन्न हो सकते हैं) एक सबक्वेरी से पढ़ने में आसान का उपयोग करता है है।

declare @Master table 
(
    ID bigint, 
    [user] varchar(16), 
    Name varchar(16) 
); 

declare @Scenario table 
(
    ID bigint, 
    ScenarioID bigint, 
    [status] varchar(16) 
); 

insert @Master values 
    (425, 'John', 'Skyline'), 
    (426, 'John', 'Violin'), 
    (427, 'Joe', 'Pura'); 
insert @Scenario values 
    (425, 1, 'active'), 
    (425, 2, 'active'), 
    (425, 3, 'done'), 
    (426, 1, 'active'), 
    (426, 2, 'active'), 
    (427, 1, 'done'); 

with ReversedScenarioCTE as 
(
    select 
     ID, 
     [status], 
     rowNumber = row_number() over (partition by ID order by ScenarioID desc) 
    from 
     @Scenario 
) 
select 
    M.ID, 
    M.[user], 
    M.Name, 
    S.[status] 
from 
    @Master M 
    inner join ReversedScenarioCTE S on 
     M.ID = S.ID and 
     S.rowNumber = 1; 
3

आप प्रत्येक मान के लिए सबसे हाल ही में देख एक CROSS APPLY के साथ ऐसा कर सकते हैं:

Select M.ID, M.[User], M.Name, X.Status 
From [Master] M 
Cross Apply 
(
    Select Top 1 S.Status 
    From Scenario S 
    Where S.ID = M.ID 
    Order By S.ScenarioID Desc 
) X 

एक और तरीका है तुम कर सकते हो यह एक ROW_NUMBER()PARTITIONEDID पर और ORDEREDScenarioIDDESC द्वारा के साथ है:

;With OrderedStatuses As 
(
    Select M.Id, M.[User], M.Name, S.Status, 
      Row_Number() Over (Partition By S.Id Order By S.ScenarioID Desc) RN 
    From [Master] M 
    Join Scenario S On S.Id = M.Id 
) 
Select Id, [User], Name, Status 
From OrderedStatuses 
Where RN = 1 
1

यदि आपके पास SQL ​​Server 2008 है या बाद में आप जो चाहते हैं उसे प्राप्त करने के लिए ROW_NUMBER() फ़ंक्शन का उपयोग कर सकते हैं। यह दो बार एक ही टेबल से पूछताछ करने या जुड़ने से बचने से बच जाएगा।

SELECT * 
FROM (

      SELECT a.[user] 
        ,a.ID 
        ,a.Name 
        ,b.status 
        ,ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY b.scenarioID DESC) AS VersionRank 
      from [master] a INNER JOIN scenario b ON a.ID = b.ID 
     ) Result 
WHERE Result.VersionRank = 1 
+0

इस प्रश्न में 'DISTINCT' का उद्देश्य क्या है? –

+0

@ जोफारेल अच्छा सवाल है कि मुझे कुछ भी संदेह नहीं है, मैंने बस मूल प्रश्न को प्रश्न से कॉपी किया है और सूट में संशोधित किया है। –

+1

@ जोफारेल ने अनावश्यक विशिष्ट हटा दिया :) –

संबंधित मुद्दे