您的数据结构存在重大问题。值应该 在行中 ,而不是 列中 。因此,从以下内容开始:
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()) + 1from dwhere val = last_valgroup by city;这样可以以行而不是列的形式为您提供所需的信息。您可以根据需要重新旋转。但我建议您将数据与城市数据保留在不同的行中。



