【发布时间】:2017-07-30 20:51:27
【问题描述】:
好吧,所以我很讨厌 SQL... 如果我在 SQL Server (2015+) 中有一个表 Forecasts,其中包含 CityName、WeatherProviderName、TimeStamp、温度摄氏, 我想要的是过去 2 天报告的每个气象提供者对每个城市的预测,加上每个城市+供应商在过去2天没有预测任何东西的最新预测 em>。
是否有一个查询来获得比单独请求 2 个更高效的查询? 我知道我可以像这样获得最新的值(基于this article):
select t.CityName, t.WeatherProviderName, t.TimeStamp, t.TempCelcius from Forecasts t
inner join (
select CityName, WeatherProviderName, TempCelcius, max(TimeStamp) as maxTime
from Forecasts where TimeStamp < DATEADD(DAY,-2, GETDATE())
group by CityName, WeatherProviderName
) tm on t.CityName = tm.CityName AND t.WeatherProviderName = tm.WeatherProviderName AND t.TimeStamp = tm.maxTime
(也尝试使用that SO question 的分区,但我的测试集慢了 3 倍以上)
我可以通过以下方式获得过去 2 天的所有内容:
select CityName, WeatherProviderName, TimeStamp, TempCelcius from Forecasts where TimeStamp > DATEADD(DAY,-2, GETDATE())
但不是将它们都运行到 2 个集合中并组合起来,有没有办法在一个快速的单个查询中同时获取它们?
答案说明
我按照@Forklift(谢谢)在下面的评论中的建议加入了工会。这是建议的选项中最快的。它看起来像这样:
SELECT t.CityName, t.WeatherProviderName, t.TimeStamp, t.TempCelcius FROM
Forecasts t
INNER JOIN (
SELECT CityName, WeatherProviderName, TempCelcius, max(TimeStamp) AS maxTime
FROM Forecasts WHERE TimeStamp < DATEADD(DAY,-2, GETDATE())
GROUP BY CityName, WeatherProviderName
) tm ON t.CityName = tm.CityName AND t.WeatherProviderName = tm.WeatherProviderName AND t.TimeStamp = tm.maxTime
UNION
SELECT CityName, WeatherProviderName, TimeStamp, TempCelcius FROM Forecasts WHERE TimeStamp > DATEADD(DAY,-2, GETDATE())
我还将@SqlZsm 标记为答案,因为它确实在单个查询中完成...所以根据您的确切需要,您可以感谢@Forklift 或@SqlZsm :)
【问题讨论】:
-
如果您只想调用一次 SQL,可以使用
UNION合并两个结果集。 -
真;我想这至少可以消除往返行程。希望可能有一些东西没有运行数据库的 2 次迭代。不是很挑剔。尽可能满足我的教育需求。
-
我认为问题在于它们实际上是 2 个具有相似形状返回数据的不同查询。我不确定您将如何通过只询问 SQL 一件事情来尝试取回这些不同的数据集。
标签: sql sql-server tsql