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