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

NGa*_*bit 0 sql sql-server greatest-n-per-group

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

Ei (第一列)是主键.

 E0 S0 DT0 V1
 E1 S1 DT1 V1
 E2 S1 DT2 V1
 E3 S1 DT3 V3
Run Code Online (Sandbox Code Playgroud)

我想过滤这个得到:

 E0 S0 DT0 V1
 E3 S1 DT3 V3
Run Code Online (Sandbox Code Playgroud)

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

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

Mul*_*ync 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;
Run Code Online (Sandbox Code Playgroud)

您可以使用分析函数(在这种情况下为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
Run Code Online (Sandbox Code Playgroud)

RANK/DENSE_RANK将返回

E0 S0 DT0 V1
E3 S1 DT3 V3
E4 S1 DT4 V3
Run Code Online (Sandbox Code Playgroud)

ROW_NUMBER

E0 S0 DT0 V1
E3 S1 DT3 V3 (or E4 S1 DT4 V3)
Run Code Online (Sandbox Code Playgroud)