sql-server - SQL 按值排序,但将来自同一用户的数据保存在一起
问题描述
我有一个User
带有ID
和Value
列的表。一般排序是 by Value DESC
,但如果用户已经存在,我想在彼此下输出相同的用户。希望它有意义(请参阅下面的所需输出):
桌子:
User Value
1111 5000
2222 6000
3333 4000
1111 1000
输出:
User Value
2222 6000
1111 5000
1111 1000
3333 4000
解决方案
您可以做的是运行一个预查询,以确定每个用户的最大值。然后可以使用此最大值来控制最终查询的排序。我使用 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。
推荐阅读
- python - 由于 django 中的 settings.py 产生错误
- html - 具有网格响应能力的引导程序仅适用于 15 个字符的第一个单词
- google-apps-script - 剪切单元格值的一部分,然后编辑并将结果粘贴到单独的单元格中
- postgresql - 如何在 PostGreSql 中自动维护已修改行的转储
- github - 如何将 github 项目从一个存储库转移到另一个存储库
- vue.js - 如何链接到 SPA 网址?
- c - 循环输入时的数组指针
- node.js - Firebase 云功能错误:已超过截止日期(Flutter 推送通知)
- php - 如何在 Laravel 中使用 Redis 缓存?
- tsql - 选择中的最小日期标志