查找该结果的最小值和相应列的值

Ley*_*h G 5 sql select

我的 SQL Server 数据库中有一个用户数据表,我正在尝试汇总这些数据。基本上,我需要一些最小值、最大值和总和值并按某些列进行分组

这是一个示例表:

Member ID | Name  | DateJoined | DateQuit  | PointsEarned | Address
00001     | Leyth | 1/1/2013   | 9/30/2013 | 57           | 123 FirstAddress Way
00002     | James | 2/1/2013   | 7/21/2013 | 34           | 4 street road
00001     | Leyth | 2/1/2013   | 10/15/2013| 32           | 456 LastAddress Way
00003     | Eric  | 2/23/2013  | 4/14/2013 | 15           | 5 street road
Run Code Online (Sandbox Code Playgroud)

我希望汇总表显示如下结果:

Member ID | Name  | DateJoined | DateQuit  | PointsEarned | Address
00001     | Leyth | 1/1/2013   | 10/15/2013 | 89           | 123 FirstAddress Way
00002     | James | 2/1/2013   | 7/21/2013  | 34           | 4 street road
00003     | Eric  | 2/23/2013  | 4/14/2013  | 15           | 5 street road
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的查询:

Member ID | Name  | DateJoined | DateQuit  | PointsEarned | Address
00001     | Leyth | 1/1/2013   | 9/30/2013 | 57           | 123 FirstAddress Way
00002     | James | 2/1/2013   | 7/21/2013 | 34           | 4 street road
00001     | Leyth | 2/1/2013   | 10/15/2013| 32           | 456 LastAddress Way
00003     | Eric  | 2/23/2013  | 4/14/2013 | 15           | 5 street road
Run Code Online (Sandbox Code Playgroud)

这次的工作Min(Address)原理是,它检索最早的 DateJoined 对应的地址。但是,如果我们交换原始表中的两个地址,我们将检索“123 FirstAddress Way”,它与加入的 1/1/2013 日期不对应。

Qse*_*bas 2

对于几乎所有事情,您都可以使用简单的 groupby,但是由于您需要“与最小日期连接所在的行相同的地址”,这有点棘手,您可以通过多种方式解决它,一种是每次都搜索地址的子查询

SELECT
   X.*, 
   (select Address 
    from #tmp t2 
    where t2.MemberID = X.memberID and 
    t2.DateJoined = (select MIN(DateJoined) 
                     from #tmp t3 
                     where t3.memberID = X.MemberID)) 
FROM
   (select MemberID, 
           Name,  
           MIN(DateJoined) as DateJoined, 
           MAX(DateQuit) as DateQuit, 
           SUM(PointsEarned) as PointEarned
from #tmp t1
group by MemberID,Name
) AS X
Run Code Online (Sandbox Code Playgroud)

` 或者其他是带有 Join 的子查询

SELECT
   X.*, 
   J.Address 
FROM
(select 
         MemberID, 
         Name,  
         MIN(DateJoined) as DateJoined, 
         MAX(DateQuit) as DateQuit, 
         SUM(PointsEarned) as PointEarned
from #tmp t1
group by MemberID,Name
) AS X
JOIN #tmp J ON J.MemberID = X.MemberID AND J.DateJoined = X.DateJoined
Run Code Online (Sandbox Code Playgroud)