我有一张这样的桌子
Fld1 Fld2 Fld3 ------------ 0 1234 ABC 0 1235 DEF 1 1236 GHI 2 1236 JKL 3 1236 MNO 4 1237 PQR 5 1237 STU 6 1237 VWX
请注意,这两列都不是唯一的. Fld1 = 0可能有很多行,但对于所有其他值,Fld1将是唯一的,并且可能有许多行具有Fld2的相同值.
我需要为Fld2的每个值选择一行,其中Fld 1中的值最高.因此基于上述数据的结果将是
Fld1 Fld2 Fl4 ------------------ 0 1234 ABC 0 1235 DEF 3 1236 MNO 6 1237 VWX
解决方法
GROUP BY的替代方法是使用像
row_number()
这样的窗口函数来获得结果.此函数通过Fld2对数据进行分区并通过Fld1 desc对其进行排序来创建唯一编号:
select Fld1,Fld2,Fld3 from ( select Fld1,Fld3,rn = row_number() over(partition by fld2 order by fld1 desc) from yourtable ) d where rn = 1;
请参阅SQL Fiddle with Demo.如果您有其他唯一的列,有时使用row_number会更容易.这给出了一个结果:
| Fld1 | Fld2 | Fld3 | |------|------|------| | 0 | 1234 | ABC | | 0 | 1235 | DEF | | 3 | 1236 | MNO | | 6 | 1237 | VWX |