Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 分组以获取最小事务_Sql Server 2008_Tsql_Group By - Fatal编程技术网

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