以下是我正在处理的数据示例:
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为整数)。
我不知道怎么做到这一点。有什么指针吗?
答案 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)