Выберите все записи из таблицы 1, но только строку в таблице 2 с максимальным номером версии - PullRequest
0 голосов
/ 31 октября 2018

У меня есть Таблица Trades.Transaction и Таблица Trades.BondRef. Они могут быть объединены в InstrumentDescription, но выдают от одной до нескольких строк, так как существует несколько ISIN/CUSIP (BondRef) на InstrumentDescription (транзакция). Я хотел бы присоединиться, но отображать только строку из Trades.BondRef с максимальным номером версии. Я просмотрел множество постов и нашел код ниже.

SELECT  tr.TradeDate,
        tr.InstrumentDescription, 
        B.maxVersion,
        B.IsLatest, 
        B.Isin,
        B.Cusip,
        B.RbcType1,
        B.RbcType2,
        B.RbcType3  
FROM [trade_management].[dbo].[Trades.Transaction] tr   WITH (NOLOCK)
INNER JOIN (
            SELECT  InstrumentDescription,
                    MAX(version) maxVersion,
                    IsLatest, 
                    Isin,
                    Cusip,
                    RbcType1,
                    RbcType2,
                    RbcType3  
            FROM [trade_management].[dbo].[Trades.BondRef] 
            WHERE ValidTo between '2018-10-30 00:00:00.0000000 +00:00' and '2018-10-30 23:59:29.0000000 +00:00' 
            GROUP BY InstrumentDescription,IsLatest, Isin,Cusip,RbcType1,RbcType2,RbcType3
            ) AS B
ON B.InstrumentDescription = tr.InstrumentDescription
WHERE
(tr.OrigSystem = 'RBCE TOMS' OR tr.OrigSystem = 'SALE')
and (BookingAccountType = 'CLIENT' OR BookingAccountType = 'MASTER') 
and tr.BookingAccountFacilitatorTeamCode in ('ESF','MJC','43B','DWV','G9J','698','9DN','A2T','AX3') -- HK Sales
and tr.IsLatest = 1 
and tr.Status not in ('Cancelled') 
and tr.TradeDate between '2018-10-30 00:00:00.0000000 +00:00' and '2018-10-30 23:59:29.0000000 +00:00'  
order  by tr.tradedate

Я получаю повторяющиеся строки, которые возвращаются, поскольку моя группа включает Исин и Кусип. Примечание. CBAAU 4 1/2 12/09/25 с Version 249 должна быть единственной возвращаемой строкой.

TradeDate   InstrumentDescription   maxVersion  Isin    Cusip   RbcType1    RbcType2    RbcType3
2018-10-30  NESNVX 3 1/8 03/22/23   124 XS1796233150    NULL        CORP    INDUSTRIAL  EURO_MTN
2018-10-30  HSBC 6 1/4 PERP         116 US404280BN80    404280BN8   CORP    BANK    GLOBAL
2018-10-30  CBAAU 4 1/2 12/09/25    248 US2027A0HR32    2027A0HR3   CORP    BANK    PRIV_PLACEMENT
2018-10-30  CBAAU 4 1/2 12/09/25    249 US2027A1HR15    2027A1HR1   CORP    BANK    EURO-DOLLAR
2018-10-30  EIB 8 3/4 08/18/25      434 XS1274823571    NULL       SUPRA    NATIONAL    EURO_MTN

Но если я удаляю их, я могу отобразить поля.

Column 'trade_management.dbo.Trades.BondRef.Isin' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Так, как я могу получить столбцы в Trades.BondRef в состоянии выбора, если они не включены в подзапрос?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы ничего не делаете, чтобы удалить не максимальные версии. Если вы можете использовать выражения общей таблицы, то это просто еще один шаг, чтобы найти максимальную версию для описания инструмента:

WITH B AS (            SELECT  InstrumentDescription,
                    MAX(version) maxVersion,
                    IsLatest, 
                    Isin,
                    Cusip,
                    RbcType1,
                    RbcType2,
                    RbcType3  
            FROM [trade_management].[dbo].[Trades.BondRef] 
            WHERE ValidTo between '2018-10-30 00:00:00.0000000 +00:00' and '2018-10-30 23:59:29.0000000 +00:00' 
            GROUP BY InstrumentDescription,IsLatest, Isin,Cusip,RbcType1,RbcType2,RbcType3),
C AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY InstrumentDescription ORDER BY maxVersion DESC) AS version_id FROM B)
SELECT  tr.TradeDate,
        tr.InstrumentDescription, 
        C.maxVersion,
        C.IsLatest, 
        C.Isin,
        C.Cusip,
        C.RbcType1,
        C.RbcType2,
        C.RbcType3  
FROM [trade_management].[dbo].[Trades.Transaction] tr   WITH (NOLOCK)
INNER JOIN C
ON C.InstrumentDescription = tr.InstrumentDescription AND c.version_id = 1
WHERE
(tr.OrigSystem = 'RBCE TOMS' OR tr.OrigSystem = 'SALE')
and (BookingAccountType = 'CLIENT' OR BookingAccountType = 'MASTER') 
and tr.BookingAccountFacilitatorTeamCode in ('ESF','MJC','43B','DWV','G9J','698','9DN','A2T','AX3') -- HK Sales
and tr.IsLatest = 1 
and tr.Status not in ('Cancelled') 
and tr.TradeDate between '2018-10-30 00:00:00.0000000 +00:00' and '2018-10-30 23:59:29.0000000 +00:00'  
order  by tr.tradedate
0 голосов
/ 31 октября 2018

Вместо использования GROUP BY и MAX вы можете использовать оконную функцию ROW_NUMBER.

Так как ROW_NUMBER может быть предоставлен заказ.
Чтобы определить, какая запись будет иметь row_number = 1.

И вы также можете объединить ORDER BY ROW_NUMBER с TOP 1 WITH TIES.

...
INNER JOIN (
        SELECT TOP 1 WITH TIES
                InstrumentDescription,
                version AS maxVersion,
                IsLatest, 
                Isin,
                Cusip,
                RbcType1,
                RbcType2,
                RbcType3  
        FROM [trade_management].[dbo].[Trades.BondRef] 
        WHERE ValidTo between '2018-10-30 00:00:00.0000000 +00:00' and '2018-10-30 23:59:29.0000000 +00:00' 
        ORDER BY ROW_NUMBER() OVER (PARTITION BY InstrumentDescription ORDER BY version DESC)
        ) AS B
ON B.InstrumentDescription = tr.InstrumentDescription
...
...