[英]Query select rows based on distinct values of a column
我當前的查詢有問題,我希望根據列獲取記錄/結果(示例列 Status 的值為 new/pending/completed 對於我執行的查詢,如果有 3 個狀態為 new 的記錄,它應該是過濾以僅顯示 1 條狀態為新的記錄)。 下面是我當前的查詢,它得到重復的列。
select a.CW_UPD_TMS,
case when a.CW_CRT_UID='AAA' then 'BBB'
else a.CW_CRT_UID end as CW_CRT_UID,
COALESCE(b.CW_S_BR, a.CW_S_BR) as CW_S_BR,
a.CW_TRX_STAT as STATUS,
SUBSTR(a.CW_UPD_TMS,7,2) as day,
SUBSTR(a.CW_UPD_TMS,5,2) as month,
SUBSTR(a.CW_UPD_TMS,1,4) as ayear,
SUBSTR(a.CW_UPD_TMS,9,2) as hours,
SUBSTR(a.CW_UPD_TMS,11,2) as mins,
SUBSTR(a.CW_UPD_TMS,13,2) as secs,
case when cast(SUBSTR(a.CW_UPD_TMS,9,2) as INT) > 12 then 'PM'
else 'AM' end as zone
from TABLEA a
left outer join TABLEB b on a.CW_CRT_UID = b.CW_S_USR
where a.CW_TRX_ID = '20150415110000798'
union
select a.CW_UPD_TMS,
case when a.CW_CRT_UID='AAA' then 'BBB'
else a.CW_CRT_UID end as CW_CRT_UID,
COALESCE(b.CW_S_BR, a.CW_S_BR) as CW_S_BR,
a.CW_TRX_STAT as STATUS,
SUBSTR(a.CW_UPD_TMS,7,2) as day,
SUBSTR(a.CW_UPD_TMS,5,2) as month,
SUBSTR(a.CW_UPD_TMS,1,4) as ayear,
SUBSTR(a.CW_UPD_TMS,9,2) as hours,
SUBSTR(a.CW_UPD_TMS,11,2) as mins,
SUBSTR(a.CW_UPD_TMS,13,2) as secs,
case when cast(SUBSTR(a.CW_UPD_TMS,9,2) as INT) > 12 then 'PM'
else 'AM' end as zone
from TABLEC a
left outer join TABLEB b on a.CW_CRT_UID = b.CW_S_USR
where a.CW_TRX_ID = '20150415110000798'
這是當前的結果:
CW_UPD_TMS CW_CRT_UID CW_S_BR STATUS DAY MONTH AYEAR HOURS MINS SECS ZONE
2015062610260746811 happy KLC NEW 26 06 2015 10 26 07 AM
2015062610273984711 happy KLC NEW 26 06 2015 10 27 39 AM
2015062610275762511 happy KLC NEW 26 06 2015 10 27 57 AM
那么現在如何更改查詢,以便僅顯示 1 條記錄(顯示 min(CW_UPD_TMS)),因為現在 3 條記錄具有相同的 STATUS (New) 。
我的預期結果應該是:
CW_UPD_TMS CW_CRT_UID CW_S_BR STATUS DAY MONTH AYEAR HOURS MINS SECS ZONE
2015062610260746811 happy KLC NEW 26 06 2015 10 26 07 AM
對不起我糟糕的英語。
它在您的情況下的預期行為。 除了“狀態”之外,您還應該想出另一列,以便它們可以形成復合鍵,這將是唯一的,並且您可以獲得單個記錄。
您可以有任何標准,如日期或任何符合您要求的標准,並使用行號屬性來限制結果為 1 條記錄。
讓我知道這是否有意義。
這可能是一個好的開始,但我不得不假設時間戳作為主鍵。 您應該在問題中提及您在哪個平台上。 如果我們了解 join 和 union 發生了什么,它也可能會更清晰。
select
d.CW_UPD_TMS, CW_CRT_UID, CW_S_BR, STATUS, day, month, ayear, hours, mins, secs, zone
from
(
select
a.CW_UPD_TMS, case when a.CW_CRT_UID='AAA' then 'BBB' else a.CW_CRT_UID end as CW_CRT_UID,
case when b.CW_S_BR is null then a.CW_S_BR else b.CW_S_BR end as CW_S_BR, a.CW_TRX_STAT as STATUS,
SUBSTR(a.CW_UPD_TMS,7,2) as day, SUBSTR(a.CW_UPD_TMS,5,2) as month, SUBSTR(a.CW_UPD_TMS,1,4) as ayear,
SUBSTR(a.CW_UPD_TMS,9,2) as hours, SUBSTR(a.CW_UPD_TMS,11,2) as mins,SUBSTR(a.CW_UPD_TMS,13,2) as secs,
case when cast(SUBSTR(a.CW_UPD_TMS,9,2) as INT) > 12 then 'PM' else 'AM' end as zone
from TABLEA a left outer join TABLEB b on a.CW_CRT_UID = b.CW_S_USR
where a.CW_TRX_ID = '20150415110000798'
union
select
a.CW_UPD_TMS, case when a.CW_CRT_UID='AAA' then 'BBB' else a.CW_CRT_UID end as CW_CRT_UID,
case when b.CW_S_BR is null then a.CW_S_BR else b.CW_S_BR end as CW_S_BR, a.CW_TRX_STAT as STATUS,
SUBSTR(a.CW_UPD_TMS,7,2) as day, SUBSTR(a.CW_UPD_TMS,5,2) as month, SUBSTR(a.CW_UPD_TMS,1,4) as ayear,
SUBSTR(a.CW_UPD_TMS,9,2) as hours, SUBSTR(a.CW_UPD_TMS,11,2) as mins,SUBSTR(a.CW_UPD_TMS,13,2) as secs,
case when cast(SUBSTR(a.CW_UPD_TMS,9,2) as INT) > 12 then 'PM' else 'AM' end as zone
from TABLEC a
left outer join TABLEB b on a.CW_CRT_UID = b.CW_S_USR
where a.CW_TRX_ID = '20150415110000798'
) as d /* data */ inner join
(
select min(CW_UPD_TMS) as CW_UPD_TMS, CW_TRX_STAT
from (
select a.CW_UPD_TMS, a.CW_TRX_STAT
from TABLEA a
where a.CW_TRX_ID = '20150415110000798'
union
select c.CW_UPD_TMS, c.CW_TRX_STAT
from TABLEC c
where c.CW_TRX_ID = '20150415110000798'
) t0
group by CW_TRX_STAT
) as r /* representative */
on r.CW_UPD_TMS = d.CW_UPD_TMS and r.CW_TRX_STAT = d.CW_TRX_STAT
要獲取最舊的記錄,您需要按日期對記錄進行排名。 因此,您要做的是將 TableA 和 TableC 結合起來,給記錄一個數字,每個狀態中最舊的為 1,然后只保留這些記錄排名 1。
select a.cw_upd_tms,
case when a.cw_crt_uid='AAA' then 'BBB'
else a.cw_crt_uid end as cw_crt_uid,
coalesce(b.cw_s_br, a.cw_s_br) as cw_s_br,
a.cw_trx_stat as status,
substr(a.cw_upd_tms,7,2) as day,
substr(a.cw_upd_tms,5,2) as month,
substr(a.cw_upd_tms,1,4) as ayear,
substr(a.cw_upd_tms,9,2) as hours,
substr(a.cw_upd_tms,11,2) as mins,
substr(a.cw_upd_tms,13,2) as secs,
case when cast(substr(a.cw_upd_tms,9,2) as int) > 12 then 'PM'
else 'AM' end as zone
from
(
select
cw_trx_stat, cw_crt_uid, cw_upd_tms
from
(
select
cw_trx_stat, cw_crt_uid, cw_upd_tms,
row_number() over (partition by cw_trx_stat order by cw_upd_tms) as rn
from
(
select cw_trx_stat, cw_crt_uid, cw_upd_tms
from tablea where cw_trx_id = '20150415110000798'
union all
select cw_trx_stat, cw_crt_uid, cw_upd_tms
from tablec where cw_trx_id = '20150415110000798'
) combined
) ranked
where rn = 1
) a
left outer join tableb b on a.cw_crt_uid = b.cw_s_usr;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.