按一列分组并从另一列中找到最小值

时间:2017-06-22 08:48:09

标签: sql sql-server grouping aggregate-functions

我正在努力学习如何使用SQL聚合函数和分组来在我的表中找到正确的记录。下面是一个简化的例子。我希望按B分组并找到最小值为C的记录。我的问题是我必须在分组中包含A或将聚合函数应用于A,这些都不合适。

A   |  B  |   C
7   |  2  |   1
4   |  2  |   2

这些是我尝试的两个查询的简化版本。

select A, B, min(c)
from @Table1
group by B, A

select min(a), B, min(c)
from @Table1
group by B

查询需要返回:

A   |  B  |   C
7   |  2  |   1

理想情况下,只有一个记录可用于多个C值。

7 个答案:

答案 0 :(得分:2)

每个B你想要的记录是最小的C.这可以用ROW_NUMBER

来实现
select a, b, c
from
(
  select a, b, c, row_number() over (partition by b order by c) as rn
  from @Table1
) ranked
where rn = 1;

如果有关系(相同的B,相同的C),则任意选择其中一个记录。如果您想要某个(例如,最小或最大的A),则扩展ORDER BY子句。如果您想要获得最佳排名记录,请使用RANKDENSE_RANK代替ROW_NUMBER

答案 1 :(得分:0)

还应该带来你想要的结果:

SELECT mt.*
 FROM mytable mt
 INNER JOIN 
    (
    SELECT B, MIN(C) as C
      FROM mytable
     GROUP BY B
    ) min
ON mt.B = min.B
AND mt.C = min.C

答案 2 :(得分:0)

您希望记录中不存在具有相同B和较低C的其他记录。

select *
from @Table1 t1
where not exists
(
  select *
  from @Table1 better
  where better.b = t1.b
    and better.c < t1.c
);

如果存在关系(相同的B,相同的C),则每个B将获得多个记录。如果您只想要其中一个,则尽可能扩展WHERE子句或选择其他解决方案。

答案 3 :(得分:0)

如果你想要每条记录都有最小C,你可以使用下面的查询。如果你想要每B一个记录,你可以使用Thorsten提供的答案。

Declare @myTable table (A int, B int, c int)
insert into @myTable values (7,2,1),(4,2,2),(6,2,1)

select a,b,c
from(
        select *, min(c)over(partition by B) minc
        from @myTable
        ) D
where c=minC

答案 4 :(得分:0)

Declare @Table1 TABLE 
    (A int, B int, C int)
;

INSERT INTO @Table1
    (A, B, C)
VALUES
    (7, 2, 1),
    (4, 2, 2)
;

脚本:

Select A.A,A.B,AA.C from 

(select B,MAX(A)A from @Table1
GROUP BY B)A
INNER JOIN (
select B,MIN(C)C from @Table1
GROUP BY B)AA
ON A.B = AA.B

答案 5 :(得分:0)

我认为这是你需要的

 select max(a),min(b),min(c) from table

答案 6 :(得分:0)

你可以像这样为你的问题写下答案。

选择A,B,MIN(C)作为 从表 B在哪里           (             SELECT Max(B)             从表             GROUP BY B           )

相关问题