SQL查询:获取某些列的值最大的行

时间:2014-12-08 21:08:47

标签: sql sql-server greatest-n-per-group

以下是我正在处理的数据示例:

Ei(第一列)是主键。

 E0 S0 DT0 V1
 E1 S1 DT1 V1
 E2 S1 DT2 V1
 E3 S1 DT3 V3

我正在尝试过滤此内容:

 E0 S0 DT0 V1
 E3 S1 DT3 V3

基本上,获取行,如果它们具有相同的Si,则选择具有最高/最大Vi的行。 Vi的格式为w.xy.z(其中w,x,y,z为整数)。

我不知道怎么做到这一点。有什么指针吗?

1 个答案:

答案 0 :(得分:6)

select ei, si, dti, vi from (
    select ei, si, dti, vi,
           row_number() over(partition by si order by vi desc) rw
    from your_tab
) as t where rw = 1;

您可以使用分析函数(在这种情况下为ROW_NUMBER)。

分析函数类似于聚合函数,因为它们应用于一组行。但是他们为每一行返回一个值。

PARTITION BY定义了一个组,ORDER BY定义了组内的排序

ROW_NUMBER根据ORDER BY为组中的每一行分配一个连续的行号(对于si的每个不同值,第一行号为1)

如果需要使用tie检索结果,可以使用RANK / DENSE_RANK函数。它们将相同的行号分配给具有相等"权重"的行。

例如

E0 S0 DT0 V1
E1 S1 DT1 V1
E2 S1 DT2 V1
E3 S1 DT3 V3
E4 S1 DT4 V3

RANK / DENSE_RANK将返回

E0 S0 DT0 V1
E3 S1 DT3 V3
E4 S1 DT4 V3

ROW_NUMBER

E0 S0 DT0 V1
E3 S1 DT3 V3 (or E4 S1 DT4 V3)