SQL查询以选择每个组具有最大值的每一行
我对SQL非常陌生,这一点让我感到困惑。你能帮我解答这个问题吗 我有以下两个表格: 表1:可发行债券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
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