SQL Server 获取不在 Group By 子句中的列?

Jor*_*ues 5 sql sql-server group-by date max

如何从该表中得到以下结果?

ID1|ID2| Date  
----------------------
1  | 1 | 01-01-2014  
1  | 2 | 02-01-2014  
2  | 3 | 03-01-2014
Run Code Online (Sandbox Code Playgroud)

当按 ID1 分组时,我想获取 ID1 和 ID2 的最大日期

结果:

1,2  
2,3
Run Code Online (Sandbox Code Playgroud)

我的代码:

SELECT 
    ID1, MAX(DATE) 
FROM 
    Table 
GROUP BY 
    ID1
Run Code Online (Sandbox Code Playgroud)

我需要类似的东西

SELECT 
    ID1, ID2, MAX(DATE) 
FROM 
    Table 
GROUP BY 
    ID1
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗?

Bac*_*its 7

有三种方法可以做到。

一、子查询:

SELECT t1.ID1, t1.ID2, t2.MAX_DATE
FROM Table t1
INNER JOIN (
    SELECT ID1, MAX(DATE) AS "MAX_DATE" FROM Table GROUP BY ID1) t2
    ON t1.ID1 = t2.ID2
Run Code Online (Sandbox Code Playgroud)

或者,OVER()如果您使用的是 SQL Server 2005+、Oracle 的最新版本或 PostgreSQL(以及不是 MySQL 或 MariaDB 的最新版本),则可以使用该子句:

SELECT ID1,
    ID2,
    MAX(DATE) OVER(PARTITION BY ID1)
FROM Table
Run Code Online (Sandbox Code Playgroud)

或者您可以使用相关子查询:

SELECT t1.ID1, 
    t1.ID2, 
    (SELECT MAX(DATE) FROM Table WHERE ID1 = t1.ID1)
FROM Table t1
Run Code Online (Sandbox Code Playgroud)


AHi*_*ins 1

您可以通过将表连接到聚合来完成此操作,如下所示:

SELECT t.*
FROM 
    Table t 
     INNER JOIN 
      (
        SELECT 
            ID1, 
            MAX(Date) MaxDate 
        FROM Table 
        GROUP BY ID1
      ) MaxDate ON
        t.ID1 = MaxDate.ID1 AND
        t.Date = MaxDate.MaxDate
Run Code Online (Sandbox Code Playgroud)