我有下表包含應用程式、版本和發布日期:
請注意,在較新版本之后發布較低版本是不可能的。(我們永遠不會降級版本)
| 應用程式 | 版本 | 日期 |
|---|---|---|
| 應用程式1 | 1.2 | 2022 年 2 月 17 日上午 11:40 |
| 應用程式1 | 1.1 | 2022 年 2 月 17 日上午 11:39 |
| 應用程式2 | 1.3 | 2022 年 2 月 17 日上午 11:38 |
| 應用程式3 | 2.6 | 2022 年 2 月 17 日上午 11:37 |
| 應用程式3 | 2.5 | 2022 年 2 月 17 日上午 11:36 |
| 應用程式2 | 1.2 | 2022 年 2 月 17 日上午 11:35 |
我想要每個應用程式輸出的最新版本:
| 應用程式 | 版本 | 日期 |
|---|---|---|
| 應用程式1 | 1.2 | 2022 年 2 月 17 日上午 11:40 |
| 應用程式2 | 1.3 | 2022 年 2 月 17 日上午 11:38 |
| 應用程式3 | 2.6 | 2022 年 2 月 17 日上午 11:37 |
我在小組中遇到麻煩,或者如果有更簡單的方法,我將不勝感激。
uj5u.com熱心網友回復:
row_number分析函式將按版本降序“排序”它們;然后選擇那些排名為“最高”的:
with temp as
(select app, ver, datum,
row_number() over (partition by app order by datum desc) rn
from your_table
)
select app, ver, datum
from temp
where rn = 1;
uj5u.com熱心網友回復:
您可以將版本拆分為主要、次要(如果存在,則為補丁)版本號并按每個版本號排序:
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY app
ORDER BY TO_NUMBER(SUBSTR(ver, 1, INSTR(ver, '.') - 1)) DESC,
TO_NUMBER(SUBSTR(ver, INSTR(ver, '.') 1)) DESC
) AS rn
FROM table_name t
)
WHERE rn = 1;
或者,使用(較慢的)正則運算式:
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY app
ORDER BY TO_NUMBER(REGEXP_SUBSTR(ver, '^(\d )\.(\d )$', 1, 1, NULL, 1)) DESC,
TO_NUMBER(REGEXP_SUBSTR(ver, '^(\d )\.(\d )$', 1, 1, NULL, 2)) DESC
) AS rn
FROM table_name t
)
WHERE rn = 1;
其中,對于樣本資料:
CREATE TABLE table_name (APP, Ver, "DATE") AS
SELECT 'app1', '1.2', CAST(TIMESTAMP '2022-02-17 11:40:00' AS DATE) FROM DUAL UNION ALL
SELECT 'app1', '1.1', CAST(TIMESTAMP '2022-02-17 11:39:00' AS DATE) FROM DUAL UNION ALL
SELECT 'app2', '1.3', CAST(TIMESTAMP '2022-02-17 11:38:00' AS DATE) FROM DUAL UNION ALL
SELECT 'app3', '2.6', CAST(TIMESTAMP '2022-02-17 11:37:00' AS DATE) FROM DUAL UNION ALL
SELECT 'app3', '2.5', CAST(TIMESTAMP '2022-02-17 11:36:00' AS DATE) FROM DUAL UNION ALL
SELECT 'app2', '1.2', CAST(TIMESTAMP '2022-02-17 11:35:00' AS DATE) FROM DUAL UNION ALL
SELECT 'app4', '1.2', CAST(TIMESTAMP '2022-02-17 11:35:00' AS DATE) FROM DUAL UNION ALL
SELECT 'app4', '1.12', CAST(TIMESTAMP '2022-02-17 11:35:00' AS DATE) FROM DUAL
兩個輸出:
應用程式 版本 日期 注冊護士 應用程式1 1.2 2022-02-17 11:40:00 1 應用程式2 1.3 2022-02-17 11:38:00 1 應用程式3 2.6 2022-02-17 11:37:00 1 應用程式4 1.12 2022-02-17 11:35:00 1
db<>在這里擺弄
uj5u.com熱心網友回復:
一種選擇是使用MAX(..) KEEP (DENSE_RANK ..)分析函式而不需要任何子查詢,以便獲取每個應用程式組的最新資訊,例如
SELECT app AS "App",
MAX(ver) KEEP (DENSE_RANK LAST ORDER BY "date") AS "Ver",
MAX("date") KEEP (DENSE_RANK LAST ORDER BY "date") AS "Date"
FROM t
GROUP BY app
ORDER BY "App"
Demo
感謝@MTO 的演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426871.html
