Получить последнее из последнего доступного значения SQL - PullRequest
0 голосов
/ 28 мая 2020

У меня две таблицы:

Master

MasterID PaperID Version PaperName
1        ISBN-1X 1       Medical Research
2        ISBN-1X 2       Medical Research(2)
3        ISBN-1X 3       Medical Research(2.1)
4        ISBN-2X 1       Some Research(1.0)
5        ISBN-3X 1       Unpublished Research(0.0)

PaperAuthor

MasterId AuthorName
1        ABC
2        XYZ
4        LMN

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

Как мне получить последнюю версию статьи с последним обновленным автором

Ожидаемый результат

MasterID PaperID Version PaperName                  AuthorName
3        ISBN-1X 3       Medical Research(2.1)      XYZ
4        ISBN-2X 1       Some Research(1.0)         LMN
5        ISBN-3X 1       Unpublished Research(0.0)  

Мои попытки:

Select M.MasterID, M.PaperID ,M.Version, M.PaperName, A.AuthorName
From Master M 
Inner Join 
(select  PaperID , max(version) maxversion from Master group by PaperID ) M1 
on m1.PaperID  = M.PaperID   AND M1.maxversion = M.Version
left join PaperAuthor A on M.MasterID  = A.MasterID 

ДЕМО

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Вы можете попробовать запрос ниже. Он сопоставляет недавнего автора с последними данными книги для каждого ISBN.

;WITH CTE_Master AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY PaperID ORDER BY Version DESC) AS recentOrder
FROM Master
)
SELECT c.MasterId, c.PaperId, c.Version, c.PaperName, pa.AuthorName
FROM CTE_Master as c
CROSS APPLY
(SELECT TOP 1 MasterId, AuthorName From PaperAuthor WHERE MasterId <= c.MasterId ORDER BY MasterId Desc) as pa(MasterId,AuthorName)
WHERE c.recentOrder = 1
+----------+---------+---------+-----------------------+------------+
| MasterId | PaperId | Version |       PaperName       | AuthorName |
+----------+---------+---------+-----------------------+------------+
|        3 | ISBN-1X |       3 | Medical Research(2.1) | XYZ        |
|        4 | ISBN-2X |       1 | Medical Research(2.1) | LMN        |
+----------+---------+---------+-----------------------+------------+

ОБНОВЛЕНИЕ: Если вы хотите, чтобы авторы также были ПУСТОыми,

;WITH CTE_Master AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY PaperID ORDER BY Version DESC) AS recentOrder
FROM Master
)
SELECT c.MasterId, c.PaperId, c.Version, c.PaperName, pa.AuthorName
FROM CTE_Master as c
CROSS APPLY
(SELECT TOP 1 MasterId, AuthorName From PaperAuthor WHERE MasterId <= c.MasterId ORDER BY MasterId Desc) as pa(MasterId,AuthorName)
WHERE c.recentOrder = 1 and c.MasterId <= (SELECT MAX(MasterId) FROM PaperAuthor)
UNION ALL
SELECT c.MasterId, c.PaperId, c.Version, c.PaperName, NULL as AuthorName
FROM CTE_Master as c
WHERE c.MasterId > (SELECT MAX(MasterId) FROM PaperAuthor)
+---------+---------+---------+---------------------------+------------+
| asterId | PaperId | Version |         PaperName         | AuthorName |
+---------+---------+---------+---------------------------+------------+
|       3 | ISBN-1X |       3 | Medical Research(2.1)     | XYZ        |
|       4 | ISBN-2X |       1 | Medical Research(2.1)     | LMN        |
|       5 | ISBN-3X |       1 | Unpublished Research(0.0) | null       |
+---------+---------+---------+---------------------------+------------+
1 голос
/ 28 мая 2020

Вы можете сделать это с помощью одного join и некоторых оконных функций:

select top (1) with ties m.masterid, paperid, version, papername,
       max(authorname) over (partition by paperid, grp) as authorname
from (select m.*, pa.authorname,
             count(pa.authorname) over (partition by m.paperid order by m.version) as grp
      from master m left join
           paperauthor pa
           on pa.masterid = m.masterid
     ) m
order by row_number() over (partition by m.paperid order by m.version desc);

Здесь используется трюк with ties для получения самой последней версии без дополнительного подзапроса.

Здесь - скрипт db <>.

1 голос
/ 28 мая 2020

Попробуйте следующее с row_number, вот демонстрация .

;with mst as
(
  select
    *,
    row_number() over (partition by PaperID order by version desc) as rnk
  from master
),
ppauth as
(
  select 
    *,
    row_number() over (order by MasterID desc) as rnk
  from PaperAuthor
)


select
  m.MasterID,
  PaperID,
  Version,
  PaperName,
  AuthorName
from mst m
join ppauth p
on m.rnk = p.rnk
where m.rnk = 1

Вывод:

-------------------------------------------------------------
| MasterID  PaperID  Version     PaperName        AuthorName|
-------------------------------------------------------------
|  3        ISBN-1X    3    Medical Research(2.1)    XYZ    | 
-------------------------------------------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...