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