首页 > 解决方案 > SQL 按值排序,但将来自同一用户的数据保存在一起

问题描述

我有一个User带有IDValue列的表。一般排序是 by Value DESC,但如果用户已经存在,我想在彼此下输出相同的用户。希望它有意义(请参阅下面的所需输出):

桌子:

User      Value
1111      5000
2222      6000  
3333      4000  
1111      1000

输出:

User   Value
2222   6000
1111   5000
1111   1000
3333   4000

标签: sql-server

解决方案


您可以做的是运行一个预查询,以确定每个用户的最大值。然后可以使用此最大值来控制最终查询的排序。我使用 CTE 进行最大值预查询,然后可以使用它重新加入原始表以进行最终排序。

WITH MaxUserPrice AS
(
  SELECT [User], MAX([Value]) AS MaxValue
  FROM MYTABLE
  GROUP BY [User]
)
SELECT mt.[User], mt.[Value]
FROM MYTABLE mt INNER JOIN MaxUserPrice mup ON mt.[User] = mup.[User]
ORDER BY mup.MaxValue DESC, mt.[User], mt.[Value] DESC;

这里有一个SqlFiddle

附注:

  • 我们需要[User]在最终查询中保留第二个排序标准,因为如果最大值存在相同的情况,那么我假设您希望将用户数据保持在一起。
  • 并且Value DESC还必须在 order 中,因为我们需要在同一用户中保留 value ordering。

推荐阅读