【问题标题】:Get Minimum and Maximum value per group in SQL Server 2008 R2在 SQL Server 2008 R2 中获取每个组的最小值和最大值
【发布时间】:2017-05-26 19:52:46
【问题描述】:

我需要通过Property_externalID 和Lease_ExternalID 将金额附加到每个分组的最小和最大日期列。

我该怎么做呢?

示例:结果应为每个分组返回一行:

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

表格样本数据:

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

【问题讨论】:

    标签: group-by sql-server-2008-r2 max min


    【解决方案1】:

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

    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)
    

    鉴于此,您需要从主表连接到子查询,在该子查询中您已确定每个Property_ExternalID 和Lease_ExternalID 的最小 日期。然后您需要再次加入主表(因为 Date 的最小值和最大值可能不同),然后加入另一个子查询,您已确定每个 Property_ExternalID 的 ma​​ximum 日期是多少和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
    

    诺埃尔

    【讨论】:

    • 这成功了!很抱歉没有早点回复您。
    【解决方案2】:

    您需要使用 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
    

    诺埃尔

    【讨论】:

    • 我意识到我忘记了一个重要的要求。我需要根据日期值获取最小值和最大值。可以通过简单的分组来实现吗?
    • 当然,一切皆有可能。 ;-) 你想要一个日期或所有日期的最小值和最大值吗?我更新了我的答案以灵活处理这两种可能性。
    • 我正在寻找一个附加到最小和最大日期的值。如果我从您的查询中删除“日期”分组,它会将 0.02 显示为最小值,将 23 显示为最大值。它应该是其他方式,因为 23 与最小日期相关联,而 .02 与最大日期相关联。另外,我只想返回一行。
    • 好吧,我误解了你想要的。我将提交另一个我认为对你有用的答案。
    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多