Query which I am using:
select SUM(marks)
from Table1
where name = ?
and Date = (select top 1 Date
from Table1
where name =?
and Date < ?
order by Date desc)
Table1:
id | name | marks | Date |
---|---|---|---|
1 | abc | 34 | 01/01/2021 |
2 | abc | 15 | 05/01/2021 |
3 | abc | 20 | 05/01/2021 |
4 | def | 34 | 05/01/2021 |
5 | abc | 12 | 10/01/2021 |
select sum(marks)
from Table1
where name ='abc'
and Date = (select top 1 Date
from Table1
where name = 'abc'
and Date < 10/01/2021
order by Date desc)
Result 35
CodePudding user response:
Using RANK()
would take comparatively less time:
select sum(marks)
from
(
select *, rank()OVER(order by date desc) as rnk
from table1
where name ='abc' and Date < '10/01/2021'
) as we
where rnk=1
Result: 35
Explanation:
Your query is using sub-query in WHERE clause which will check for each and every condition and you are filtering for name abc
2 times. Alternatively I am doing it once and feeding subquery in FROM
clause that significantly saves time.
Look at the demo here with time elapsed (have made some additional dummy data to check time)