I got stuck with this problem, please help if possible.
Suppose we have two tables, Table A and Table B. Table A looks like this:
ReportDate val1 ---------------- 2021-08-16 0.1 2021-08-15 0.1 2021-08-14 0.2 2021-08-13 0.2 2021-08-12 0.1
And Table B looks like this:
ReportDate val2 ---------------- 2021-08-16 1.4 2021-08-16 4.1 2021-08-16 2.1 2021-08-16 1.9 2021-08-16 5.1 2021-08-16 2.4 2021-08-16 1.6 2021-08-16 4.6 2021-08-16 3.1 2021-08-16 0.9 2021-08-16 20.6 2021-08-16 0.4 2021-08-16 2.6 2021-08-16 0.1 2021-08-15 1.4 2021-08-15 20.9 2021-08-15 5.9 2021-08-15 0.1 2021-08-15 0.9 2021-08-15 0.4 ...
In table B we have around 23 values for each date, now we need to match val1 of table A to val2 of tableB for each date and return its position in the row for example 0.1 on 2021-08-16 in Table A should look for a match in table B val2 and should return its position in the row (14 in case of 0.1)
I tried multiple ways (including row_number(), etc) but none of them is working. Many thanks in advance. I need an output like this
ReportDate val1 Match ------------------------ 2021-08-16 0.1 14 2021-08-15 0.1 4 and so on..
I am trying to use row_number so, that I can create a row number on TableB and then use Case statement with Table A to get the row_number which matches with val1, I tried similar queries like below but none of them are working the sequence of the rows get changed whenever I use ranking functions, as I need the sequence of the rows exactly as shown for the table B otherwise the position of the values will change
SELECT * FROM (SELECT *, row_number() OVER (Partition by rnk, reportdate ORDER BY ReportDate)rnk2 FROM (SELECT *, row_number() OVER (PARTITION BY ReportDate, val2 ORDER BY ReportDate DESC) rnk FROM (SELECT ReportDate, val2 FROM tableB) a ORDER BY ReportDate DESC) b ) c ORDER BY ReportDate DESC, rnk2
Advertisement
Answer
You can use simple left join and row_number()
Create table #temp
(
ReportDate date,  val1 decimal(6,1)
)
Create table #temp2
(
ReportDate date,  val2 decimal(6,1)
)
insert into #temp
values
('2021-08-16',  0.1)
,('2021-08-15',  0.1)
,('2021-08-14',  0.2)
,('2021-08-13',  0.2)
,('2021-08-12',  0.1)
insert into #temp2
values
('2021-08-16',  1.4 )
,('2021-08-16',  4.1 )
,('2021-08-16',  2.1 )
,('2021-08-16',  1.9 )
,('2021-08-16',  5.1 )
,('2021-08-16',  2.4 )
,('2021-08-16',  1.6 )
,('2021-08-16',  4.6 )
,('2021-08-16',  3.1 )
,('2021-08-16',  0.9 )
,('2021-08-16',  20.6)
,('2021-08-16',  0.4 )
,('2021-08-16',  2.6 )
,('2021-08-16',  0.1 )
,('2021-08-15',  1.4 )
,('2021-08-15',  20.9)
,('2021-08-15',  5.9 )
,('2021-08-15',  0.1 )
,('2021-08-15',  0.9 )
,('2021-08-15',  0.4 )
select t1.ReportDate,t1.val1,rownum as [Match]  
from #temp as t1
left join  (
select *,ROW_NUMBER() over (partition by ReportDate order by (select null)) as rownum from #temp2
) as t2
on t1.ReportDate = t2.ReportDate and t1.val1 = t2.val2
where rownum is not null
drop table #temp
drop table #temp2