1

我有一张像这样的桌子:

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

我想选择所有具有 distinct 的行,在每组中flag选择最低的 所以,在这个例子中我会得到:priceflag

id(int)    flag(int)    price(float)

1          0            50
2                       400
3          4            200
5          3            100
7          2            120

请注意,这flag不是强制性的,因此它可以有一个值(int)或什么都没有(null)。

问候

编辑:

只是为了让它更清楚。

我想选择所有具有 aid和 a的行price,而不是按价格过滤。然后我想只加入每组价格最低的行flags

4

3 回答 3

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

于 2012-08-16T14:35:24.613 回答
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)
于 2012-08-16T14:37:33.643 回答
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

最后一个查询使用分组的结果,再次与原始表连接,然后过滤价格与最小值不同的行

于 2012-08-16T14:46:20.493 回答