SQL 查询每行 select 每组最大值

SQL Query to select each row with max value per group

我是 SQL 的新手,这个让我很困惑。你能帮我解决这个问题吗?

我有以下 2 个表:

TABLE 1: 问题表

Id   | RunId | Value
---
1    | 1     | 10  
2    | 1     | 20  
3    | 1     | 30  
4    | 2     | 40  
5    | 2     | 50  
6    | 3     | 60 
7    | 4     | 70 
8    | 5     | 80 
9    | 6     | 90 

TABLE 2: 运行表

RunId     | EnvironmentId
---
1         | 1
2         | 3
3         | 1
4         | 2
5         | 4
6         | 2

我需要代表 RunTable 中按 EnvironmentId 分组的 Max RunId 的 IssueTable 行。我需要从表中得到的结果是:

预期结果:

Id   | RunId | Value | EnvironmentId
---
4    | 2     | 40    | 3
5    | 2     | 50    | 3
6    | 3     | 60    | 1
8    | 5     | 80    | 4
9    | 6     | 90    | 2

因此只有每个 EnvironmentId 的 RunTable 中具有最多 recent/highest RunId 的行。例如,对于“1”的 EnvironmentId,我只想要包含“3”的 RunId 的行,因为 RunTable 中 EnvironmentId“1”的最新 RunId 是“3”。同样,EnvironementId“2”的最新 运行 是 RunId“6”

使用子查询从运行表中获取每个环境标识的最大运行标识。将获得的结果加入问题表和 select 所需的列。

select i.id, i.runid, i.value, r.environmentid
from (select environmentid, max(runid) maxrunid
      from runtable 
      group by environmentid) r
join issuetable i on i.runid = r.maxrunid
order by i.runid, i.id

现在可以使用 RANK、DENSE_RANK、ROW_NUMBER 等分析函数来生成一些记录排名。

Window 函数是 ANSI SQL:2003 标准的一部分。
我至少在 TeraData、Oracle 和 SQL-Server 上遇到过它们。

select Id, RunId, Value, EnvironmentId
from (
  select i.*, r.EnvironmentId,
  dense_rank() over (partition by r.EnvironmentId order by r.RunId desc) as RN
  from issuetable i
  inner join runtable r on (i.RunId = r.RunId)
) Q
where RN = 1
order by Id;

内部查询将产生以下结果:

Id  RunId   Value   EnvironmentId   RN
1   1       10      1               2
2   1       20      1               2
3   1       30      1               2
4   2       40      3               1
5   2       50      3               1
6   3       60      1               1
7   4       70      2               2
8   5       80      4               1
9   6       90      2               1