Sql server 2008 分组以获取最小事务
目前,我有如下交易清单:Sql server 2008 分组以获取最小事务,sql-server-2008,tsql,group-by,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
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))
任何正确方向的帮助或指点都会受到极大的欢迎
谢谢。您需要根据前台ID对其进行分组,然后根据数据差异进行订购,您将获得最小值 大概是这样的:
SELECT id
FROM tbl
GROUP BY id
ORDER BY difference
如果您想“查找交易日期和结算日期之间天数最短的每个前台ID的
交易ID”,为什么需要分组依据“
如果您想为所有事务ID查找它,您可以使用CTE+行编号
:
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\u RANK
而不是ROW\u NUMBER
,您可以使用ROW\u NUMBER()
并在[前台ID]
上执行分区
;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
这就更有意义了。谢谢。@chrissyp:请注意,我编辑了我的答案,显示您可以使用CTE选择所有列,而不仅仅是事务ID
。您使用的是什么,在哪里
?
;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