分组依据获得最小交易

时间:2015-04-30 09:25:04

标签: sql-server-2008 tsql group-by

目前我有一个交易清单如下:

Front Office ID    Transaction ID    TradeDate    SettlementDate
10000              1234              2015-03-03   2015-03-04
10000              1235              2015-03-03   2015-06-17
10001              1232              2015-03-13   2015-03-18
10001              1231              2015-03-13   2015-06-17

我需要做的是查找每个前台办公室ID的交易ID,该交易ID在交易日期和结算之间的天数最短。

我知道如何获得日期差异,但我很困惑如何通过以下方式让它在小组中发挥作用:

MIN(DATEDIFF(DD,FX.TradeDate,FX.SettleDate))

正确的方向提供了任何帮助或指示。

感谢。

3 个答案:

答案 0 :(得分:0)

您需要按照Front Office ID对其进行分组,然后按数据差异进行排序,您将获得最小值。

这样的事情:

SELECT id  
FROM tbl 
GROUP BY id
ORDER BY difference

答案 1 :(得分:0)

为什么您需要GROUP BY如果您想要找到交易ID&每个Front Office ID ,其交易日期和交易日期之间的天数最短结算"

SELECT TOP 1 t.[Transaction ID] 
FROM dbo.Transactions t
WHERE t.[Front Office ID] = @FrontOfficeID
ORDER BY DATEDIFF(DD,  t.TradeDate, t.SettleDate) ASC

如果您想要为所有交易ID找到它,您可以使用CTE + ROW_NUMBER

WITH CTE AS
(
    SELECT t.[Transaction ID],  t.[Front Office ID], t.TradeDate, t.SettleDate
           RN = ROW_NUMBER() OVER (PARTITION BY [Front Office ID] 
                                   ORDER BY DATEDIFF(DD,  t.TradeDate, t.SettleDate) ASC)
    FROM dbo.Transactions t
)
SELECT [Transaction ID],  [Front Office ID], TradeDate, SettleDate
FROM CTE
WHERE RN = 1

如果您想要返回TradeDate和SettleDate之间时间间隔最短的所有交易ID(如果有关系),请使用DENSE_RANK代替ROW_NUMBER

答案 2 :(得分:0)

您可以使用DefaultAppPool并在ROW_NUMBER()上执行PARTITION BY

[Front Office ID]