在最新组中查找最新组
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
我有 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