i have a problem for my current query, i wish to get record/result based on a column (example column Status have the value of new/pending/completed for the query i execute if there are 3 record with status new,it should be filter to show 1 record with status new only). Below is my current query which get duplicate column .
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'
Here is current result:
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
so now how do i change the query so that only show 1 record only (show with min(CW_UPD_TMS)) as now 3 record have same STATUS (New) .
my expected result should be :
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
sorry for my poor english.
Its expected behaviour in your case. You should come up with another column in addition to "Status" so they could form composite key, which will be unique and you get single record for it.
Either you can have any criteria like date or anything which suits your requirement and use row number attribute to limit result with 1 record.
Let me know if this make sense.
This might be a good start but I had to assume that timestamp works as a primary key. You should mention which platform you're on in the question. It might also be cleaner if we understood what was going on with the joins and the 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
To get the oldest record, you need to rank the records by date. So what you'd do is combine TableA and TableC, give the records a number, with 1 for the oldest per status, then only keep those records ranked 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;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.