Это запрос группы и островов, но он стал более сложным, потому что у вас есть несколько столбцов для обработки.
Я бы порекомендовал разницу номера строки и даты для определения группы. Затем оконная функция для получения значений:
select t.*,
count(*) over (partition by chfusd, dateadd(day, - seqnum_chfusd, date)) as cnt_usd,
count(*) over (partition by chfjpy, dateadd(day, - seqnum_chfjpy, date)) as cnt_jpy,
count(*) over (partition by chfeur, dateadd(day, - seqnum_chfeur, date)) as cnt_eur,
count(*) over (partition by chfgbp, dateadd(day, - seqnum_chgbp, date)) as cnt_gbp
from (select t.*,
row_number() over (partition by chfusd order by date) as seqnum_chfusd,
row_number() over (partition by chfjpy order by date) as seqnum_chfjpy,
row_number() over (partition by chfeur order by date) as seqnum_chfeur,
row_number() over (partition by chfgbp order by date) as seqnum_chfgbp
from t
) t;
Если вы хотите это для самой последней даты, то добавьте select top (1)
и order by date desc
. Для другой даты используйте подзапрос.