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是整数).
我不知道怎么做到这一点.有什么指针吗?
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)