我有一張像下面這樣的雪花表:

我想為每個不同的組合“COMPANY”-“BUSINESS UNIT”-“APPROVER LEVEL”獲取最新資料的條目(如果我們有多個最近日期的條目,它應該回傳所有條目) . 因此,考慮到上面示例的表格,它將回傳以下內容:

我必須以雪花順序撰寫的 SQL 查詢是什么?
uj5u.com熱心網友回復:
與布蘭登的回答非常相似,使用QUALIFY:
但是鑒于您想要排名第一的專案,請使用RANK(與Phil 提到的DENSE_RANK相同)
資料的 CTE(我使用 NUMBERS 作為有效日期,但 TEXT 也可以很好地排序,或者轉換為 DATE 也可以):
WITH sample_data as (
SELECT * FROM VALUES
('c1', 'but1', 'l1', 20220406, 'Mr. 0', 'id0' ),
('c1', 'but1', 'l1', 20220406, 'Mr. 1', 'id2' ),
('c1', 'but1', 'l1', 20220212, 'Mr. 2', 'id2' ),
('c1', 'but1', 'l1', 20220130, 'Mr. 3', 'id3' ),
('c1', 'but1', 'l2', 20220320, 'Mr. 4', 'id4' ),
('c1', 'but1', 'l2', 20220115, 'Mr. 5', 'id5' ),
('c1', 'but1', 'l2', 20220102, 'Mr. 6', 'id6' )
t(company, business_unit, approver_level, valid_from, approver_name, approver_id)
)
下面的 SQL
SELECT *
FROM sample_data
QUALIFY rank() over(partition by company, business_unit, approvel_level order by valid_from desc ) = 1;
給出:
| 公司 | BUSINESS_UNIT | APPROVER_LEVEL | VALID_FROM | APPROVER_NAME | APPROVER_ID |
|---|---|---|---|---|---|
| c1 | 但是1 | l1 | 20220406 | 0先生 | id0 |
| c1 | 但是1 | l1 | 20220406 | 1先生 | id2 |
| c1 | 但是1 | l2 | 20220320 | 4先生 | id4 |
如果您的資料庫不是 Snowflake(因為您已經標記了問題)并且沒有 QUALIFY,那么這是執行此模式的方法:
WITH smaple_data as (
SELECT * FROM VALUES
('c1', 'but1', 'l1', 20220406, 'Mr. 0', 'id0' ),
('c1', 'but1', 'l1', 20220406, 'Mr. 1', 'id2' ),
('c1', 'but1', 'l1', 20220212, 'Mr. 2', 'id2' ),
('c1', 'but1', 'l1', 20220130, 'Mr. 3', 'id3' ),
('c1', 'but1', 'l2', 20220320, 'Mr. 4', 'id4' ),
('c1', 'but1', 'l2', 20220115, 'Mr. 5', 'id5' ),
('c1', 'but1', 'l2', 20220102, 'Mr. 6', 'id6' )
t(company, business_unit, approver_level,
valid_from, approver_name, approver_id)
)
SELECT company, business_unit,
approver_level, valid_from,
approver_name, approver_id
FROM (
SELECT company, business_unit,
approver_level, valid_from,
approver_name, approver_id,
DENSE_RANK() OVER (PARTITION BY COMPANY, BUSINESS_UNIT, APPROVER_LEVEL
ORDER BY VALID_FROM DESC) as dr
FROM smaple_data
)
WHERE dr = 1
ORDER BY 1,2,3;
uj5u.com熱心網友回復:
您可以利用 Qualify 來處理這個問題。為此,這樣的事情應該有效
SELECT *
FROM table_a
QUALIFY ROW_NUMBER() OVER (PARTITION BY COMPANY, BUSINESS_UNIT, APPROVER_LEVEL
ORDER BY VALID_FROM DESC) = 1
;
uj5u.com熱心網友回復:
主要思想與@Brandon Coleman 建議的相同,只需要稍微調整一下。
with cte as
(
select max(rn) max_rn from (
select rank() over (partition by company,bu,appr_lvl
order by valid_from) rn
from your_table_name)
)
select *,rank() over (partition by company,bu,appr_lvl
order by valid_from) rn
from your_table_name,cte
qualify rn>=cte.max_rn;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/457457.html
