获取相应的(未聚合)值到聚合值

时间:2013-10-11 15:55:50

标签: sql-server group-by

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通常是如此声明,但我觉得在我经常遇到的这种查询形式中,查询实际上看起来并不像你自己想到的那样。

1 个答案:

答案 0 :(得分: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)应用“排名”。