在 SQL Server 2008 R2 中获取每组的最小值和最大值
Get Minimum and Maximum value per group in SQL Server 2008 R2
我需要根据 Property_externalID
和 Lease_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_ExternalID
和 Lease_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
诺尔
我需要根据 Property_externalID
和 Lease_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_ExternalID
和 Lease_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
诺尔