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