SQL Server,包括不在group by语句中的列
我有一个永久性的问题,SQL Server,包括不在group by语句中的列,sql,sql-server,Sql,Sql Server,我有一个永久性的问题, 假设我有以下列: T:A(PK), B, C, D, E 现在, 不,我不能: select A, C, MAX(B) from T group BY A 我不明白为什么-当涉及到AVG或SUM时,我明白了。但是,MAX或MIN仅从一行获取 如何处理它?您可以使用行编号() select A, C, B from ( select * , row_number() over (partition by A order by B desc) se
假设我有以下列:
T:A(PK), B, C, D, E
现在,
不,我不能:
select A, C, MAX(B) from T group BY A
我不明白为什么-当涉及到AVG
或SUM
时,我明白了。但是,MAX
或MIN
仅从一行获取
如何处理它?您可以使用
行编号()
select A, C, B
from (
select *
, row_number() over (partition by A order by B desc) seq
-- group by ^ max(^)
from yourTable ) t
where seq = 1;
这是因为select列表中包含的列也应该是group by
子句的一部分。您可能有属于分组依据的列,但不在选择列表中,反之亦然
通常,只在select子句中放置希望分组的列。试试这个。它可以帮助您仅通过1列(f1)找到最大值,还可以添加所需的列(f3),但不会影响最大值操作
SELECT m.f1,s.f2,m.maxf3 FROM
(SELECT f1,max(f3) maxf3 FROM t1 GROUP BY f1) m
CROSS APPLY (SELECT TOP(1) f2,f1 FROM t1 WHERE m.f1 = f1) s
你的问题不是很清楚,因为我们不确定你想做什么
假设您实际上不希望在主查询中执行group by,但希望基于列a返回B的最大值,您可以这样做
select A, C,(Select Max(B) from T as T2 WHERE T.A = T2.A) as MaxB from T
“最大值或最小值正好来自一行。”-真的吗?您从未遇到过这样的情况,例如,B
列中有多行具有相同的值,而该值恰好表示最小值或最大值?您希望如何处理C列中的数据?如果要对其进行分组,则只需将其添加到分组部分:来自T group BY A,C
请描述C列的期望输出是什么?如果调试器不允许您这样做,则意味着它不是从一行获得的。常规group BY规则说:如果指定了group BY子句,选择列表中的每个列引用必须标识分组列或是集合函数的参数<代码>其中seq=1
-这是什么意思?这个答案就是我要建议的。子查询t对行进行编号,按您希望(B)的最大值的列降序排序,并将其称为“seq”。然后选择其中的seq=1,这将是B值最高的行,以及它的所有其他数据(例如col C)。这里可能值得一提的是,当多行之间存在连接时会发生什么情况。在本例中,它将任意选择其中一行。@Damien_该问题的非信徒使用densed_RANK
)。
select A, C,(Select Max(B) from T as T2 WHERE T.A = T2.A) as MaxB from T