Help with sql using analytical functions. [message #677151] |
Thu, 22 August 2019 19:45  |
 |
ramkumar10
Messages: 19 Registered: March 2017
|
Junior Member |
|
|
Hi ,
I have a sql related question
I am writing a sql to check if a column has same value in multiple rows and if yes I have to use an filter condition if not do nothing and pass the rows. I am using analytical function rank and case statements to achieve the above.
Below is the code:
with t1 as
(SELECT
mnt,
case when rank() over (partition by ltrim(rtrim(mnt)) order by ltrim(rtrim(mnt)) asc) >1 then 'Y' else 'N' end as flag,
rank() over (partition by mnt order by mnt) as rn,
dense_rank() over (partition by mnt order by mnt) as drn,
FROM tablename1),
t2 as (
SELECT
mnt,
rel,
lif,
lts,
lokez
FROM tablename2
WHERE lts <> ""
AND PARTITIONTIME = TIMESTAMP(CURRENT_DATE())
)
,t3 as
(SELECT
lif,
lifn,
lts,
par FROM tablename3)
,t4 as (SELECT rcv FROM tablename4
WHERE mes = 'PRO')
select * from (
SELECT t1.mnt as mnt,
t2.rel as zel,
t2.lokez as ZLOEKZ,
t4.rcv as Zrcv
FROM t1
left join t2
on replace(t1.mnt, '00000000', '') = REPLACE(t2.mnt, '00000000', '') AND t1.lif = t2.lif and t2.lts <> ""
and
case when t1.flag = 'Y' and t2.rel ='X' then 1
when (t1.flag ='N' and t2.rel=t2.rel) or (t1.flag ='N' and t2.rel is null) then 1
when t1.flag = 'Y' and t2.rel <>'X' then 2
else 3
end = 1
left join t3 ON t1.lif = t3.lif
AND t2.lts = t3.lts
AND t3.par = 'BA'
left join t4 on t4.rcv = t3.lifn
and t2.lokez is null
) where ZLOEKZ is null
order by mnt
as you can see I am checking if there are more than one value in a group for mnt column i have to filter and pass only the record with the following condition rel='X' if not i.e if the mnt value is unique in the table then just pass the row no filter condition needs to be applied.
to achieve the above I have first used rank function to create a flag
case when rank() over (partition by ltrim(rtrim(mnt)) order by ltrim(rtrim(mnt)) asc) >1 then 'Y' else 'N' end as flag
then in the filter condition I have applied filter based on the flag
case when t1.flag = 'Y' and t2.rel ='X' then 1
when (t1.flag ='N' and t2.rel=t2.rel) or (t1.flag ='N' and t2.rel is null) then 1
when t1.flag = 'Y' and t2.rel <>'X' then 2
else 3
end = 1
but for some reason the filter is not getting applied so i checked using rank and dense rank if the functions are working as i intended and below is the sample output
mnt flag rn drn rel lokez rcv
100 N 1 1 X abc 123
100 N 1 1 null xyz 123
100 N 1 1 null def 234
but since mnt column has value 100 three times only the row with rel = X should pass and remaining both rows should not be seen also the rank and dense rank function are 1 for all three rows I am not able to understand what I am doing wrong, even the flag is getting set wrong.
any advise appreciated.
note:I do not have access to data from home so tomorrow i will manually get few rows and paste the create and insert sql here in the mean time please glance through my code and point me if I am doing something wrong which is obvious.
Thanks for the time.
Regards,
RamKumar
|
|
|
|
|
Re: Help with sql using analytical functions. [message #677164 is a reply to message #677153] |
Tue, 27 August 2019 19:34   |
 |
ramkumar10
Messages: 19 Registered: March 2017
|
Junior Member |
|
|
Michel Cadot wrote on Fri, 23 August 2019 00:58
From your previous topic:
Michel Cadot wrote on Thu, 10 August 2017 10:25
Please read OraFAQ Forum Guide and How to use [code] tags and make your code easier to read.
Align the columns in result.
Also always post your Oracle version, with 4 decimals, as solution depends on it.
With any SQL or PL/SQL question, please, Post a working Test case: create table (including all constraints) and insert statements along with the result you want with these data then we will be able work with your table and data. Explain with words and sentences the rules that lead to this result.
Also, we are still waiting for your feedback in your previous topics.
Hi,
Which one are you talking about if it is about hash question I asked then there is no resoluttion I could find or that has worked for me.
Regarding sample data yes as I mentioned I did not have the data for me to post at that moment later on count() function worked for me so i have not posted any thing yet.
Also I have been away for a couple of days.
Thanks,
Ram.
|
|
|
|