Sql 使用MAX和GROUP BY时如何只获得一个结果

Sql 使用MAX和GROUP BY时如何只获得一个结果,sql,sql-server,sql-order-by,Sql,Sql Server,Sql Order By,我希望在这个问题上得到一些帮助: select * from STORAGE_MOVEMENT where object_id = 43500 and current_location != 6411 and object_class = 'SAMPLE' 以下是我得到的: 我只想得到这两个中移动次数最大的结果。使用MAXmove_编号可以工作,但我还需要其他信息,特别是Moved_On列中的数据 我正在尝试使用此查询,但不起作用: SELECT MAX(move_number), obj

我希望在这个问题上得到一些帮助:

select *
from STORAGE_MOVEMENT 
where  object_id = 43500 and current_location != 6411 and object_class = 'SAMPLE'
以下是我得到的:

我只想得到这两个中移动次数最大的结果。使用MAXmove_编号可以工作,但我还需要其他信息,特别是Moved_On列中的数据

我正在尝试使用此查询,但不起作用:

SELECT MAX(move_number), object_id, original_location, current_location, moved_on   
FROM    
    (SELECT *
     FROM STORAGE_MOVEMENT 
     WHERE object_id = 43500 AND current_location != 6411 AND object_class = 'SAMPLE'
     ) A
GROUP BY 
    object_id, original_location, current_location, moved_on
但这显示的结果与前面的查询基本相同:

谢谢。

您应该使用行号功能:

SELECT 
    ROW_NUMBER() OVER(ORDER BY move_number DESC) AS Row#, 
    object_id, original_location, current_location, moved_on   
FROM 
    (SELECT *
     FROM STORAGE_MOVEMENT 
     WHERE object_id = 43500 AND current_location != 6411 AND object_class = 'SAMPLE'
     GROUP BY moved_on) A
WHERE 
    Row# = 1;

这是因为您在使用max时使用了其他列

必须限制列数,并对结果与其余列执行联接

大概

SELECT DISTINCT a.maximu, b.object_id, b.original_location, b.current_location, b.moved_on FROM 
(SELECT MAX (move_number) as maximum, current_location) FROM STORAGE_MOVEMENT GROUP BY current_location) as a 
JOIN STORAGE_MOVEMENT as b ON a.current_location = b .current_location as b
根据当前_位置和其他值,可以获得move_number的最大值​​属于当前位置的


但是,数据将是冗余的,因此必须使用,例如,DISTINCT,或者可能添加join maximum move_number值。因此,a.maximum=b.move\u number看起来像是您想要top1

 SELECT top(1) *
 FROM STORAGE_MOVEMENT 
 WHERE object_id = 43500 AND current_location != 6411 AND object_class = 'SAMPLE'
 ORDER BY move_number DESC

真正地它向您显示了什么消息?当使用Group by时,它会为您指定的所有列查找具有相同值的行,然后将这些行合并为一行。在您的情况下,两行中似乎只有object_id相同;其他字段是不同的,因此在group by中成为单独的行。它向您显示了什么消息?我们无法运行该查询,@dontknowcoding,我们无法访问您的实例,但是,我可以清楚地看到您的子查询中有一个GROUP BY子句,它使用SELECT*,因此没有聚合函数,并且由于WHERE引用了其他列,表中显然有多个列。因此,您将得到一个错误,列“object_id”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。由于某些原因,它在我的列表中不起作用。它向我显示以下错误:[SQL Server]列名“行”无效。我将您的代码更改为这一行,但基本上是相同的:按“移动编号描述”选择行编号OVERORDER作为行、对象id、原始位置、当前位置、从选择移动*从存储移动,其中对象id=43500和当前位置!=6411和object_class='SAMPLE'A,其中Row=1