2017-10-12 91 views
0

我有一个包含3个字段的数据列表,ISIN,CompanyId和EffectiveDate。 ISIN在公司ID和生效日期都被复制。字段1在字段2上复制,需要根据字段3选择1,并返回字段1和字段2

实施例的数据:

ISIN   CompanyId EffectiveDate 
AED001410045 58105545  2012-02-09 
AEDFXA1G39P8 132844116 2016-04-22 
AEDFXA1G39P8 132844116 2017-09-21 
ARDEUT110020 249603  2012-02-09 
ARDEUT110020 416264458 2017-03-22 

使用

SELECT ISIN, CompanyId, MAX(EffectiveDate) 
FROM [MappingData].[dbo].[ESGMappingISIN] 
GROUP BY ISIN,CompanyId 

我可以删除关于ISIN和CompanyId重复项以返回

ISIN   CompanyId EffectiveDate 
AED001410045 58105545  2012-02-09 
AEDFXA1G39P8 132844116 2017-09-21 
ARDEUT110020 249603  2012-02-09 
ARDEUT110020 416264458 2017-03-22 

的最后一步,我需要的是:

A) Return ISIN and CompanyId where ISIN is distinct 
B) If 1 ISIN has 2 CompanyIds, return the line with the later effective date. 

理想输出

ISIN   CompanyId EffectiveDate 
AED001410045 58105545  2012-02-09 
AEDFXA1G39P8 132844116 2017-09-21 
ARDEUT110020 416264458 2017-03-22 
+0

什么[标签:RDBMS]您使用的? – Mureinik

+0

使用子查询获取所需的行,连接回主表以从中获取数据列。同样的逻辑在这里:https://stackoverflow.com/questions/19432913/select-info-from-table-where-row-has-max-date/19433107#19433107 – Twelfth

回答

1

您可以使用row_number()

SELECT * 
FROM (SELECT ISIN, CompanyId, MAX(EffectiveDate) as maxed, 
      ROW_NUMBER() OVER (PARTITION BY ISIN ORDER BY MAX(Effectivedate) DESC) as seqnum 
     FROM [MappingData].[dbo].[ESGMappingISIN] 
     GROUP BY ISIN, CompanyId 
    ) m 
WHERE seqnum = 1; 
+0

好的答案,但可能无法正常工作RDBMS – Twelfth

+0

@第十二。 。 。这是ANSI标准的SQL语法,当没有特定的数据库标签时这似乎是合理的。 –

1

您可以使用这样的子查询:

SELECT 
    B.ISIN, 
    B.CompanyID, 
    B.EffectiveDate 
FROM 
    (
     SELECT 
     ISIN, 
     CompanyId, 
     MAX(EffectiveDate) AS EffectiveDate 
     FROM 
     ESGMappingISIN 
     GROUP BY 
     ISIN, 
     CompanyId 
    ) 
    AS B 
    JOIN 
     (
     SELECT 
      ISIN, 
      MAX(EffectiveDate) AS EffectiveDate 
     FROM 
      ESGMappingISIN 
     GROUP BY ISIN 
    ) AS A 
     ON B.ISIN = A.ISIN 
     AND B.EffectiveDate = A.EffectiveDate 
相关问题