Group By 以获得最小交易
Group By to get min transaction
目前我有如下交易清单:
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。
我知道如何获取日期差异,但我对如何通过以下方式在组中工作感到困惑:
MIN(DATEDIFF(DD,FX.TradeDate,FX.SettleDate))
任何正确方向的帮助或指示都非常受欢迎。
谢谢。
需要先按Front Office ID分组,再按数据差异排序,即可得到min.
像这样:
SELECT id
FROM tbl
GROUP BY id
ORDER BY difference
如果你想 "find transaction ID's per Front Office ID which has the shortest number of days between trade date and settlement" 为什么还需要 GROUP BY
?
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
如果您想要 return 所有在 TradeDate 和 SettleDate 之间具有最短时间跨度的交易 ID(在平局的情况下),请使用 DENSE_RANK
而不是 ROW_NUMBER
。
您可以使用 ROW_NUMBER()
并在 [Front Office ID]
上执行 PARTITION BY
。
;WITH CTE AS
(
SELECT
[Front Office ID] ,
[Transaction ID],
ROW_NUMBER()OVER( PARTITION BY [Front Office ID] ORDER BY DATEDIFF(DD,FX.TradeDate,FX.SettleDate) ASC) rn
FROM FX
)
SELECT [Front Office ID] ,[Transaction ID]
FROM CTE WHERE rn = 1
目前我有如下交易清单:
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。
我知道如何获取日期差异,但我对如何通过以下方式在组中工作感到困惑:
MIN(DATEDIFF(DD,FX.TradeDate,FX.SettleDate))
任何正确方向的帮助或指示都非常受欢迎。
谢谢。
需要先按Front Office ID分组,再按数据差异排序,即可得到min.
像这样:
SELECT id
FROM tbl
GROUP BY id
ORDER BY difference
如果你想 "find transaction ID's per Front Office ID which has the shortest number of days between trade date and settlement" 为什么还需要 GROUP BY
?
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
如果您想要 return 所有在 TradeDate 和 SettleDate 之间具有最短时间跨度的交易 ID(在平局的情况下),请使用 DENSE_RANK
而不是 ROW_NUMBER
。
您可以使用 ROW_NUMBER()
并在 [Front Office ID]
上执行 PARTITION BY
。
;WITH CTE AS
(
SELECT
[Front Office ID] ,
[Transaction ID],
ROW_NUMBER()OVER( PARTITION BY [Front Office ID] ORDER BY DATEDIFF(DD,FX.TradeDate,FX.SettleDate) ASC) rn
FROM FX
)
SELECT [Front Office ID] ,[Transaction ID]
FROM CTE WHERE rn = 1