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

时间:2016-06-28 17:33:26

标签: sql greatest-n-per-group

我对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"

2 个答案:

答案 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