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
我是 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