我正在努力学习如何使用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值。
答案 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
子句。如果您想要获得最佳排名记录,请使用RANK
或DENSE_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 )