在 SQL Server 2008 R2 中获取每组的最小值和最大值

Get Minimum and Maximum value per group in SQL Server 2008 R2

我需要根据 Property_externalIDLease_ExternalID 获取每个分组的最小和最大日期列所附的金额。

我该怎么做?

示例:结果应 return 每个分组一行:

Property_ExternalID Lease_ExternalID    Min_Amount      Max_Amount
------------------------------------------------------------------
27050               27050-0200          23              .02    

Table样本数据:

Property_ExternalID Lease_ExternalID    PropertyAssetId Date        Amount
---------------------------------------------------------------------------
27050               27050-0200          6097            10/1/2017   23
27050               27050-0200          6097            4/1/2019    0.02
27050               27050-0200          6097            4/1/2021    0.02
27050               27050-0200          6097            4/1/2022    0.02
27050               27050-0200          6097            4/1/2023    0.02
27050               27050-0200          6097            4/1/2024    0.02
27050               27050-0200          6097            4/1/2025    0.02
27050               27050-0200          6097            4/1/2027    0.02
27050               27050-0200          6097            4/1/2026    0.02

您需要使用 MIN 和 MAX aggregate functions 以及 GROUP BY 子句。这应该适合你...

DECLARE @MyDate AS DATE

-- comment the next line out if you want all dates
SET @MyDate = '04/01/2021'

SELECT Property_ExternalID, Lease_ExternalID, Date, MIN(Amount) AS 'Min_Amount',
MAX(Amount) AS 'Max_Amount'
FROM YourTable
WHERE Date = COALESCE(@MyDate, Date)
GROUP BY Property_ExternalID, Lease_ExternalID, Date

诺尔

提供一些基本的 SQL 语句来创建 table 和数据总是有帮助的,这样帮助您的人可以尝试不同的事情。像这样...

IF OBJECT_ID('tempdb..#Temp', 'U') IS NOT NULL DROP TABLE #Temp;

CREATE TABLE #Temp
(
 Property_ExternalID    VARCHAR(15),
 Lease_ExternalID   VARCHAR(15),
 PropertyAssetId    VARCHAR(15),
 Date           DATE,
 Amount         DECIMAL(10, 2)
)

INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '10/1/2017', 23)  
INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '04/1/2019', 0.02)
INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '04/1/2021', 0.02)
INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '04/1/2022', 0.02)
INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '04/1/2023', 0.02)
INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '04/1/2024', 0.02)
INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '04/1/2025', 0.02)
INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '04/1/2027', 0.02)
INSERT INTO #Temp VALUES ('27050', '27050-0200', '6097', '04/1/2026', 0.02)

鉴于此,您需要从主 table 加入一个子查询,您已在其中确定每个 Property_ExternalID 最小 日期和Lease_ExternalID。然后你需要再次加入你的主 table (因为 Date 的最小值和最大值可能不同)然后加入另一个子查询,你已经确定了 maximum每个 Property_ExternalIDLease_ExternalID.

的日期

像这样...

SELECT a.Property_ExternalID, a.Lease_ExternalID, a.Amount AS 'Min_Amount', b.Amount AS 'Max_Amount'
FROM #Temp a
INNER JOIN 
(
    SELECT Property_ExternalID, Lease_ExternalID, MIN(Date) AS MinDate 
    FROM #Temp 
    GROUP BY  Property_ExternalID, Lease_ExternalID
) x ON a.Property_ExternalID = x.Property_ExternalID AND a.Lease_ExternalID = x.Lease_ExternalID AND a.Date = x.MinDate
INNER JOIN #Temp b ON a.Property_ExternalID = b.Property_ExternalID AND a.Lease_ExternalID = b.Lease_ExternalID
INNER JOIN 
(
    SELECT Property_ExternalID, Lease_ExternalID, MAX(Date) AS MaxDate 
    FROM #Temp 
    GROUP BY  Property_ExternalID, Lease_ExternalID
) y ON b.Property_ExternalID = y.Property_ExternalID AND b.Lease_ExternalID = y.Lease_ExternalID AND b.Date = y.MaxDate

诺尔