状态对应最小值

时间:2010-03-27 13:18:31

标签: sql

我正在使用SQL Server 2005.我有一个表格,如下所示。每个FundingID可以有多个取消。我想选择FundingCancellationReason对应每个资金的最短日期。我写了一个查询如下。这是一个SQL错误

1)你能帮我避免SQL错误吗?

2)有没有更好的逻辑来实现同样的目标?

CREATE TABLE #FundingCancellation(
[FundingCancellationID] INT IDENTITY(1,1) NOT NULL,
[FundingID] INT ,
FundingCancellationDt SMALLDATETIME ,
FundingCancellationReason VARCHAR(50)
) 


SELECT        FundingID, 
              MIN(FundingCancellationDt),
              ( SELECT FundingCancellationReason 
                FROM #FundingCancellation FC2 
                WHERE FC1.FundingID = FC2.FundingID
                AND FC2.FundingCancellationDt = MIN(FundingCancellationDt)
              ) [Reason Corresponding Minimum Date] 
FROM #FundingCancellation FC1
GROUP BY FundingID

- 聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。

我已经看到类似的方法在一个有点复杂的查询中工作。所以我相信tehre将是一种纠正我的查询的方法

由于 Lijo

1 个答案:

答案 0 :(得分:0)

此查询将为每个FundingID的每个最小日期返回Reason(以及您可能需要的任何其他列):

SELECT FC1.FundingID, FC1.FundingCancellationDt, 
         FC1.FundingCancellationReason, FC1.OtherColumn1, FC1.Other...
FROM #FundingCancellation FC1
JOIN
(
    SELECT FundingID, MIN(FundingCancellationDt) as 'MinDate'
    FROM #FundingCancellation
    GROUP BY FundingID
) AS Grouped ON (Grouped.FundingID = FC1.FundingID 
                   AND (Grouped.MinDate = FC1.FundingCancellationDt 
                        OR Grouped.MinDate IS NULL))

请注意,如果给定的FundingID具有多个具有相同FundingCancellationDt的行(并且它是最小值),则这将返回该最小日期的所有原因。

“OR Grouped.MinDate IS NULL”允许空日期。

如果您有一个FundingID的最小重复日期,并且您仍然只想要每个最小值的一个原因,那么请使用:

SELECT FundingID, MinDate,
    (SELECT TOP 1 FundingCancellationReason 
        FROM #FundingCancellation 
        WHERE FundingCancellationDt = Grouped.MinDate) as 'Reason'
FROM 
(
    SELECT FundingID, MIN(FundingCancellationDt) as 'MinDate'
    FROM #FundingCancellation
    GROUP BY FundingID
) AS Grouped