我有一张表:
id(int) flag(int) price(float)
1 0 50
2 400
3 4 200
4 3 150
5 3 100
6 3 400
7 2 120
我想选择具有不同flag
的所有行,在每个price
组中选择最低flag
所以,在这个例子中,我得到:
id(int) flag(int) price(float)
1 0 50
2 400
3 4 200
5 3 100
7 2 120
请注意,flag
不是必需的,因此它可以有值(int)或没有(null)。
此致
编辑:
只是为了清楚。
我想选择所有包含id
和price
的行,而不是按价格过滤。
那么我只想加入flags
答案 0 :(得分:3)
SELECT id, flag, price
FROM tbl t
WHERE NOT EXISTS (
SELECT 1
FROM tbl tt
WHERE t.flag = tt.flag
AND (tt.price < t.price
OR (tt.price = t.price AND t.id < tt.id)));
这是一个sqlfiddle。
答案 1 :(得分:2)
以下查询查找每个标志的最低价格,然后将它们连接到原始数据以获取ID(以及该行的其他信息)。
select t.*
from table t join
(select flag, min(price) as minprice
from table t
group by flag
) tsum
on (tsum.flag = t.flag or tsum.flag is null as t.flag is null) and
(tsum.minprice = t.price)
答案 2 :(得分:0)
我认为你需要Id列,如果不是你只需要这样做
SELECT flag, MIN(price) as price FROM Table GROUP BY flag
如果你需要它,你必须这样做
SELECT TBL1.*
FROM table TBL1
LEFT JOIN (SELECT flag, MIN(price) as price FROM table GROUP BY flag) TBL2
ON TBL1.flag = TBL2.flag AND TBL1.price = TBL2.price
WHERE TBL2.price IS NOT NULL
最后一个查询使用分组结果,再次与原始表连接,然后过滤价格与最小值不同的行