1
SELECT M.TradeDate, M.Expiry, M.Future
FROM MTM as M 
JOIN (SELECT TradeDate, MIN(Expiry) as Expiry
      FROM MTM
      WHERE Code = 'GOVI'
        and Type = 'F'
      GROUP BY TradeDate) as T 
ON M.TradeDate = T.TradeDate and M.Expiry = T.Expiry
WHERE M.Code = 'GOVI'
  and M.Type = 'F'
ORDER BY TradeDate

在这个查询中,我想提取一个 TradeDate、最近的到期日(分钟)和对应于即将到期的“未来”值。这个相应的未来意味着我现在必须有一个臃肿的嵌套查询。该查询确实可以完美运行。但我确信必须有一种更快(开发,不一定要执行)、更清晰的方式来编写它。没有嵌套查询,也没有重复完全相同的WHERE条件。我想也许 OVER 可以提供帮助,但我不知道如何。这真的是唯一的方法吗?

SQL 通常是声明性的,但我觉得在这种我经常遇到的查询形式中,查询读起来真的不像你自己在脑海中提出的请求。

4

1 回答 1

1

自联接方法是旧的、昂贵的方法,您会发现它的成本随着表的变大呈指数增长。自 2005 年以来,我们已经能够使用窗口函数ROW_NUMBER()来返回分组结果以及该行中的非分组数据。以下是我将如何编写您的查询:

;WITH m AS 
(
  SELECT TradeDate, Expiry, Future, rn = ROW_NUMBER() OVER 
   (PARTITION BY TradeDate ORDER BY Expiry) 
  FROM dbo.MTM 
  WHERE Code = 'GOVI' AND Type = 'F'
)
SELECT TradeDate, Expiry, Future 
  FROM m 
  WHERE rn = 1 
  ORDER BY Expiry;

基本上,这需要每个唯一的 TradeDate 并根据 Expiry 的值对每个集合(从 1-n)应用一个“等级”。

于 2013-10-11T15:59:14.693 回答