我有一個包含 ID、FAMILY、ENV_XML_PATH 和 CREATED_DATE 列的表。
| ID | 家庭 | ENV_XML_PATH | 創建日期 |
|---|---|---|---|
| 15826841 | 客戶關系管理 | path1.xml | 03-09-22 上午 6:50:34 |
| 15826856 | 單片機 | path3.xml | 03-10-22 上午 7:12:20 |
| 15826786 | 我知道了 | path4.xml | 02-10-22 12:50:52AM |
| 15825965 | 客戶關系管理 | path5.xml | 02-10-22 上午 1:50:52 |
| 15653951 | 無效的 | path6.xml | 04-10-22 12:50:52AM |
| 15826840 | 鰭 | path7.xml | 03-10-22 上午 2:34:09 |
| 15826841 | 單片機 | path8.xml | 02-10-22 上午 8:40:52 |
| 15223450 | 我知道了 | path9.xml | 03-09-22 上午 5:34:09 |
| 15026853 | 單片機 | path10.xml | 05-10-22 上午 4:40:59 |
現在 FAMILY 列中有 18 個 DISTINCT 值,每個值都有關聯的多行(如上圖所示)。我想要的是在 FAMILY 列中獲取 3 個特定值(CRM、SCM 和 IC)的第一行。
像這樣的東西:
| ID | 家庭 | ENV_XML_PATH | 創建日期 |
|---|---|---|---|
| 15826841 | 客戶關系管理 | path1.xml | 日期1 |
| 15826856 | 單片機 | path3.xml | 日期2 |
| 15826786 | 我知道了 | path4.xml | 日期3 |
我對此很陌生,雖然我理解邏輯,但我不確定如何實作它。請幫忙。謝謝。
uj5u.com熱心網友回復:
您可以使用視窗函式來了解按family排序的每個磁區的行號created_date,然后按您感興趣的三個系列進行過濾:
with row_window as (
select
id,
family,
env_xml_path,
created_date,
row_number() over (partition by family order by created_date asc) as rn
from <your_table>
where family in ('CRM', 'SCM', 'IC')
)
select
id,
family,
env_xml_path,
created_date
from row_window
where rn = 1
輸出:
| ID | 家庭 | ENV_XML_PATH | 創建日期 |
|---|---|---|---|
| 15826841 | 客戶關系管理 | path1.xml | 03-09-22 6:50:34 |
| 15826856 | 單片機 | path3.xml | 03-10-22 7:12:20 |
| 15826786 | 我知道了 | path4.xml | 02-10-22 12:50:52 |
uj5u.com熱心網友回復:
你可以使用RANK它。像這樣的東西:
WITH groupedData AS
(SELECT id, family, env_xml_path, created_date,
RANK () OVER (PARTITION BY family ORDER BY id) AS r_num
FROM yourtable
GROUP BY id, family, env_xml_path, created_date)
SELECT id, family, env_xml_path, created_date
FROM groupedData
WHERE r_num = 1
ORDER BY id;
因此,在第一個查詢中,您的資料將按家庭分組并按您想要的列排序(在我的示例中,它將按 id 排序)。
之后,您將使用第二個查詢僅獲取每個族的第一行。
WHERE如果您需要對結果集應用更多限制,請在第一個查詢中添加一個子句。
在這里查看一個作業示例:db<>fiddle
uj5u.com熱心網友回復:
這個問題并沒有真正說明“第一個”是什么意思,但我認為這意味著第一個被添加到表中的人,也就是日期最老的人。試試這個代碼:
SELECT DISTINCT * FROM (yourTable) WHERE Family = 'CRM' OR
Family = 'SCM' OR Family = 'IC' ORDER BY Created_Date ASC FETCH FIRST (number) ROWS ONLY;
它能做什么:
Distinct - 它選擇不同的行,這意味著您不會在頂部獲得相同型別的行。
Where - 檢查某個條件是否為真
OR - 這意味著選擇應該選擇符合這些要求的行。在當前情況下, distinct 子句意味著相同的行不會重復,因此您不會獲得 2 個不同的“CRM”姓氏,因此它將找到第一個“CRM”然后是第一個“SCM”,依此類推。
ORDER BY - 按指定順序對列進行排序。在當前行中,如果第一行表示最舊的,則通過按日期對它們進行排序并使用 ASC,最舊的(又名最小的日期)將位于頂部。
FETCH FIRST (number) ROWS ONLY - 它只選擇你想要的前幾行。例如,如果您需要 3 個不同的“第一”行,則需要獲取FETCH FIRST 3 ROWS ONLY。結合不同的單詞,它只會顯示 3 個不同的行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522699.html
標籤:sql甲骨文
