我对SQL很新,这个让我很难过。你能帮我解决一下这个问题吗?
我有以下2个表格:
表1:IssueTable
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:RunTable
RunId | EnvironmentId
---
1 | 1
2 | 3
3 | 1
4 | 2
5 | 4
6 | 2
我需要IssueTable行来表示由RunTable中的EnvironmentId分组的Max RunId。我需要从表中得到的结果是:
预期结果:
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的行。例如,对于" 1"的EnvironmentId,我只想要包含" 3"的RunId的行。因为EnvironmentId" 1"上的最新RunId来自RunTable的是" 3"。同样,最近的EnvironementId" 2"是RunId" 6"
答案 0 :(得分:3)
使用子查询从runtable获取每个环境的最大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
答案 1 :(得分:2)
现在可以使用RANK,DENSE_RANK,ROW_NUMBER等分析函数生成一些记录排名。
窗口函数是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