您的数据结构存在重大问题。值应该 在行中 ,而不是 列中 。因此,从以下内容开始:
select d.dte, v.*from data d cross apply
(values ('Toronto', Toronto), ('Cairo', Cairo), . . .
) v(city, val)
where d.date >= dateadd(day, -5, getdate());
从那里,我们可以使用window函数first_value()
(或last_value()
)来获取最新的读数。其余的只是按城市汇总:
with d as (
select d.dte, v.*,
first_value(v.val) over (partition by v.city order by d.dte desc) as last_val
from data d cross apply
(values ('Toronto', Toronto), ('Cairo', Cairo), . . .
) v(city, val)
where d.date >= dateadd(day, -5, getdate())
)
select city, datediff(day, min(dte), getdate()) + 1
from d
where val = last_val
group by city;
这样可以以行而不是列的形式为您提供所需的信息。您可以根据需要重新旋转。但我建议您将数据与城市数据保留在不同的行中。