我的表中有資料,如下所示:
輸入 :
version value code type
PMS 0.00 01 HOURS
000 312.00 01 HOURS
000 0.00 04 HOURS
PMS 0.00 01 NON STOCK
000 835.00 01 NON STOCK
000 835.00 04 NON STOCK
- 第一步:按代碼排序,即01和04。
- 第 2 步:按型別排序,即 HOURS 和 NON STOCK。
- 第 3 步:按版本檢索,如果為 0.00,則檢索記錄。
輸出說明:
對于代碼 = 01,我們有 4 條記錄,型別 = HOURS 有 2 條記錄,型別 = NON STOCK 有 2 條記錄。但選擇版本不等于 PMS 的記錄(由于列型別重復)。因此我們得到兩個代碼為 01 的輸出。
000 312.00 01 HOURS
000 835.00 01 NON STOCK
對于代碼 = 04,我們有 2 條記錄,1 條記錄用于型別 = HOURS,1 條記錄用于型別 = NON STOCK。因為我們這里沒有列型別的重復項,所以在這種情況下不需要比較版本。因此我們得到兩個代碼為 01 的輸出
000 0.00 04 HOURS
000 835.00 04 NON STOCK
(資料庫引擎是 Azure databricks)
預期產出:
version value code type
000 312.00 01 HOURS
000 835.00 01 NON STOCK
000 0.00 04 HOURS
000 835.00 04 NON STOCK
uj5u.com熱心網友回復:
假設如果沒有重復的行,即使版本是 PMS,您也需要提取記錄。嘗試這個:
select
*
from(
select
a.*,
case when b.code is not null and version <>'PMS' then 1
when b.code is null then 1
else 0 end as filter_val
from
input a
left outer join
(Select
code,
type
from input
group by
code,
type having count(*) > 1) b
on a.code=b.code
and a.type=b.type) x
where filter_val=1;
uj5u.com熱心網友回復:
你可以做:
select
version, value, code, type
from (
select *,
row_number() over(partition by code, type order by version) as rn
from t
) x
where rn = 1
order by code, type
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327554.html
下一篇:Postgres三月奇怪的結果
