Как написать подзапросы в TypeORM для объединения, сортировки и возврата последнего результата

#sql #sql-server #database #subquery #typeorm

Вопрос:

Я хочу объединить две таблицы, отсортировать их и вернуть последнюю, используя измененную дату возвращенной объединенной таблицы. Я успешно написал SQL-запрос на SQL server, и он возвращает желаемый результат. Однако мне нужно написать этот запрос для работы с TypeORM. Как мне написать это в TypeORM.

Вот в чем проблема. Я создал две виртуальные таблицы, таблицу активов и LotBids, вот так

 (assetsInSaleEventId varchar(50), 
assetNumber varchar(100), 
lotNumber varchar(100), 
saleEventId varchar(50), 
PRIMARY KEY (assetsInSaleEventId)
)
insert into @Assets values
    --First Sale Event (ID = '1B68BD21-238E-4B00-B7F2-FABC0C2690AA')
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CA', 'ab101', '1', '1B68BD21-238E-4B00-B7F2-FABC0C2690AA'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CB', 'ab102', '2', '1B68BD21-238E-4B00-B7F2-FABC0C2690AA'),
    --Second Sale Event (ID = '1B68BD21-238E-4B00-B7F2-FABC0C2690AB')
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CE', 'ab105', '5', '1B68BD21-238E-4B00-B7F2-FABC0C2690AB'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CF', 'ab106', '6', '1B68BD21-238E-4B00-B7F2-FABC0C2690AB'),
    -- Third Sale Event (ID = '1B68BD21-238E-4B00-B7F2-FABC0C2690AC')
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CI', 'ab109', '9', '1B68BD21-238E-4B00-B7F2-FABC0C2690AC'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CJ', 'ab110', '10', '1B68BD21-238E-4B00-B7F2-FABC0C2690AC'),
    --Fourth Sale Event (ID = '1B68BD21-238E-4B00-B7F2-FABC0C2690AD')
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CM', 'ab113', '13', '1B68BD21-238E-4B00-B7F2-FABC0C2690AD'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CO', 'ab114', '14', '1B68BD21-238E-4B00-B7F2-FABC0C2690AD'),
    --Fifth Sale Event (ID = '1B68BD21-238E-4B00-B7F2-FABC0C2690AE')
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CR', 'ab117', '17', '1B68BD21-238E-4B00-B7F2-FABC0C2690AE'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690CS', 'ab118', '18', '1B68BD21-238E-4B00-B7F2-FABC0C2690AE')
declare @Lots table 
(lotBidsId varchar(50), 
assetsInSaleEventId varchar(50), 
clientNumber varchar(200), 
clientName varchar(100),
auditModifiedDatetime datetime,
primary key (lotBidsId)
)
insert into @Lots values
    -- Lot Bids on Asset '1B68BD21-238E-4B00-B7F2-FABC0C2690CA', for first Sale Event
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LA', '1B68BD21-238E-4B00-B7F2-FABC0C2690CA', 'ray100', 'Raymond', '2021-06-21 15:10:15'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LB', '1B68BD21-238E-4B00-B7F2-FABC0C2690CA', 'ray100', 'Raymond', '2021-06-23 15:10:15'),
    -- Lot Bids on Asset '1B68BD21-238E-4B00-B7F2-FABC0C2690CB', for first Sale Event
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LD', '1B68BD21-238E-4B00-B7F2-FABC0C2690CB', 'ray100', 'Raymond', '2021-06-21 16:10:15'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LE', '1B68BD21-238E-4B00-B7F2-FABC0C2690CB', 'ara100', 'Arash', '2021-06-23 16:10:15'),
    -- Lot Bids on Asset '1B68BD21-238E-4B00-B7F2-FABC0C2690CC', for first Sale Event
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LG', '1B68BD21-238E-4B00-B7F2-FABC0C2690CC', 'ara100', 'Arash', '2021-06-21 17:10:15'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LH', '1B68BD21-238E-4B00-B7F2-FABC0C2690CC', 'ray100', 'Raymond', '2021-06-23 17:10:15'),
    -- Lot Bids on Asset '1B68BD21-238E-4B00-B7F2-FABC0C2690CD', for first Sale Event
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LJ', '1B68BD21-238E-4B00-B7F2-FABC0C2690CD', 'franc100', 'Francis', '2021-06-21 18:10:15'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LK', '1B68BD21-238E-4B00-B7F2-FABC0C2690CD', 'ara100', 'Arash', '2021-06-23 18:10:15'),
    -- Lot Bids on Asset '1B68BD21-238E-4B00-B7F2-FABC0C2690CE', for second Sale Event
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LN', '1B68BD21-238E-4B00-B7F2-FABC0C2690CE', 'franc100', 'Francis', '2021-07-12 18:10:15'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LO', '1B68BD21-238E-4B00-B7F2-FABC0C2690CE', 'ray100', 'Arash', '2021-07-15 18:10:15'),
    -- Lot Bids on Asset '1B68BD21-238E-4B00-B7F2-FABC0C2690CF', for second Sale Event
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LR', '1B68BD21-238E-4B00-B7F2-FABC0C2690CF', 'franc100', 'Francis', '2021-07-12 19:10:15'),
    -- Lot Bids on Asset '1B68BD21-238E-4B00-B7F2-FABC0C2690CG', for second Sale Event
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LU', '1B68BD21-238E-4B00-B7F2-FABC0C2690CG', 'franc100', 'Francis', '2021-07-12 20:10:15'),
    ('1B68BD21-238E-4B00-B7F2-FABC0C2690LV', '1B68BD21-238E-4B00-B7F2-FABC0C2690CG', 'ray100', 'Arash', '2021-07-15 20:10:15')

select a.assetNumber, l.assetsInSaleEventId, l.lastModified, l.clientNumber, l.clientName
from @Assets a 
inner join 
(
    select 
      l.assetsInSaleEventId,
      l.auditModifiedDatetime as lastModified,
      l.clientNumber,
      l.clientName
      from @Lots l 
      where l.auditModifiedDatetime = (select max(l2.auditModifiedDatetime)
      where l2.assetsInSaleEventId = l.assetsInSaleEventId 
      )
   ) l
   on a.assetsInSaleEventId  = l.assetsInSaleEventId
where a.saleEventId = '1B68BD21-238E-4B00-B7F2-FABC0C2690AA' 
 

Выше приведен мой SQL-запрос для объединения, сортировки и возврата последних значений для каждого отсортированного результата.
Как я могу написать запрос в TypeORM ?