SQL查询以选择每个组具有最大值的每一行

SQL查询以选择每个组具有最大值的每一行,sql,greatest-n-per-group,Sql,Greatest N Per Group,我对SQL非常陌生,这一点让我感到困惑。你能帮我解答这个问题吗 我有以下两个表格: 表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

我对SQL非常陌生,这一点让我感到困惑。你能帮我解答这个问题吗

我有以下两个表格:

表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 
表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中具有最新/最高RunId的行。例如,对于EnvironmentId为“1”的行,我只需要包含RunId为“3”的行,因为RunTable中EnvironmentId为“1”的最新RunId为“3”。同样,environmentid“2”的最近一次运行是RunId“6”

使用子查询从runtable中获取每个environmentid的最大RunId。将获得的结果连接到issuetable并选择所需的列

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

如今,人们可以使用诸如排名、密集排名、行数等分析函数来生成记录的一些排名

窗口函数是ANSI SQL:2003标准的一部分。
我至少在TeraData和SQL Server上见过它们。

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

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

您的关系数据库管理系统是什么?Sql Server、postgres、oracle?窗口函数是在Sql:2003中引入的,而不是1999年。DB2、Postgres、Firebird和其他一些函数也支持它们。事实上,我发现的这篇文章让我错误地认为这些函数的标准是错误的。谢谢你指出这一点。答案中对此进行了更正。值得注意的是,
ROW_NUMBER()
是建议的方法中唯一一种,它可以确保即使多次出现MAX值,每个组(分区)也只有一行,并且还可以轻松地将其他字段用作ORDER BY子句中的连接断路器。
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