我有一张像这样的桌子
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
答案 0 :(得分:7)
GROUP BY
的替代方法是使用类似row_number()
的窗口函数来获取结果。此功能通过按Fld2
对数据进行分区并按Fld1 desc
对其进行排序来创建唯一编号:
select Fld1, Fld2, Fld3
from
(
select Fld1, Fld2, 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 |
答案 1 :(得分:1)
使用group by
:
select max(fld1), fld2
from table t
group by fld2;
答案 2 :(得分:0)
a)根据Gordons的回答,得到第一个只有两列的结果 b)用它来查询剩余的列。
SELECT r.* FROM table r
INNER JOIN
(select max(fld1), fld2
from table t
group by fld2) s ON (r.fld1=s.fld1 AND r.fld2=s.fld2)