在最新组中查找最新组

Find latest group within latest group

我有 table 如下所示

+----------+---------------+------------+------------+---------+--------------+--------------+
| Parentid | Parentversion | parentname | parentdesc | childid | childversion | childname    |
+----------+---------------+------------+------------+---------+--------------+--------------+
| 101      | 1             | Car        | 400Km/h    | 801     | 1            | Steel door   |
| 101      | 1             | Car        | 400Km/h    | 801     | 2            | Plastic door |
| 101      | 2             | Car        | 320km/h    | 801     | 1            | Steel door   |
| 101      | 2             | Car        | 320km/h    | 801     | 2            | Plastic door |
| 102      | 1             | Bike       | 120km/h    | 601     | 1            | Petrol       |
| 102      | 2             | Bike       | 130km/h    | 601     | 1            | Petrol       |
+----------+---------------+------------+------------+---------+--------------+--------------+

我想在其中找到最新版本的 parentid,然后找到最新的子版本。我的预期输出是

+----------+---------------+------------+------------+---------+--------------+--------------+
| Parentid | Parentversion | parentname | parentdesc | childid | childversion | childname    |
+----------+---------------+------------+------------+---------+--------------+--------------+
| 101      | 2             | Car        | 320km/h    | 801     | 2            | Plastic door |
| 102      | 2             | Bike       | 130km/h    | 601     | 1            | Petrol       |
+----------+---------------+------------+------------+---------+--------------+--------------+

我已经试过了,但我相信应该有一个简单的方法。

WITH car AS (
    SELECT *, row_number() OVER (PARTITION BY parentid ORDER BY parentversion DESC) rn
    FROM cartable
    ), 
latestparent AS (
    SELECT * FROM car WHERE rn = 1
    ), 
latestchild AS (
    SELECT *, row_number() OVER (
            PARTITION BY Parentid, Parentversion, parentname, parentdesc, childid ORDER BY childversion DESC
            ) rn
    FROM latestparent
    )
SELECT *
FROM latestchild
WHERE rn = 1

您应该可以像这样使用 row_number()

select c.*
from (select c.*,
             row_number() over (partition by parentid order by parentversion desc, childversion desc) as seqnum
      from cartable c
     ) c
where seqnum = 1;

基本上,当您按版本降序排序时,您需要第一行。

使用过 CTE

 ;With LatestVersion_CTE as
 (
  select c.*,
  row_number() over (partition by c.parentid order by c.parentversion desc, c.childversion desc) as seqnum
  from cartable c
 )
 select * from LatestVersion_CTE  
 where seqnum= 1