9

我的数据库结构包含列:id, name, value, dealer. 我想value每个 dealer检索最低的行。我一直试图搞砸MIN()and GROUP BY,仍然 - 没有解决方案。

4

7 回答 7

25

解决方案1:

SELECT t1.* FROM your_table t1
JOIN (
  SELECT MIN(value) AS min_value, dealer
  FROM your_table 
  GROUP BY dealer
) AS t2 ON t1.dealer = t2.dealer AND t1.value = t2.min_value

解决方案2:

SELECT t1.* FROM your_table t1
LEFT JOIN your_table t2
ON t1.dealer = t2.dealer AND t1.value > t2.value
WHERE t2.value IS NULL

这个问题非常有名,所以在Mysql的手册中有专门的一页。

检查这一点:持有某一列的分组最大值/最小值的行

于 2012-09-24T09:02:12.637 回答
3
select id,name,MIN(value) as pkvalue,dealer from TABLENAME 
group by id,name,dealer;

在这里,您按 id、name、dealer 对所有行进行分组,然后您将获得最小值作为 pkvalue。

于 2012-09-24T09:01:53.650 回答
3
SELECT MIN(value),dealer FROM table_name GROUP BY dealer;
于 2012-09-24T09:03:32.083 回答
1

首先,您需要为每个经销商解析最低值,然后为特定经销商检索具有该值的行。我会这样做:

SELECT a.*
FROM   your_table AS a
       JOIN (SELECT dealer,
                    Min(value) AS m
             FROM   your_table
             GROUP  BY dealer) AS b
         ON ( a.dealer= b.dealer
              AND a.value = b.m ) 
于 2012-09-24T09:05:37.987 回答
0

尝试以下操作:

SELECT dealer, MIN(value) as "Lowest value"
FROM value
GROUP BY dealer;
于 2012-09-24T09:02:29.360 回答
0
select id, name, value, dealer from yourtable where dealer 
in(select min(dealer) from yourtable group by name, value)
于 2012-09-24T09:10:44.220 回答
0

这些答案似乎错过了经销商有多个最小值并且只想返回一行的边缘情况。

如果您只想为每个经销商提供一个值,您可以使用 row_number 分区 - 组 - 按经销商的表,然后按值和 id 对数据进行排序。我们必须假设您需要具有最小 id 的行。

SELECT ord_tbl.id, 
       ord_tbl.name, 
       ord_tbl.value, 
       ord_tbl.dealer
FROM (SELECT your_table.*, 
      ROW_NUMBER() over (PARTITION BY dealer ORDER BY value ASC, ID ASC) 
      FROM your_table 
     ) AS ord_tbl
WHERE ord_tbl.ROW_NUMBER = 1;

请注意,尽管该值、id 和经销商已被索引。如果不是,这将进行全表扫描,并且可能会变得很慢......

于 2020-06-16T00:44:16.513 回答