首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按最大值对多列进行排序

按最大值对多列进行排序
EN

Stack Overflow用户
提问于 2018-06-20 19:15:59
回答 2查看 364关注 0票数 3

通过查看每行中最大的列值,对查询进行排序的最有效方法是什么?

例如:

代码语言:javascript
复制
Dan | 5 | 0 | 3
Moe | 0 | 9 | 2
Joe | 3 | 3 | 8

排序这个数据集应该返回: Moe,Joe,Dan

我的数据集比上面更复杂,所以我试图避免任何组合子查询与组的最大值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 19:17:43

你可以用CROSS APPLY

代码语言:javascript
复制
SELECT *
FROM tab t
CROSS APPLY (SELECT MAX(col) c FROM (VALUES(t.col1),(t.col2),(t.col3)) sub(col)) s
ORDER BY s.c DESC;

DBFiddle演示

输出:

代码语言:javascript
复制
┌──────┬──────┬──────┬──────┬───┐
│ name │ col1 │ col2 │ col3 │ c │
├──────┼──────┼──────┼──────┼───┤
│ Moe  │    0 │    9 │    2 │ 9 │
│ Joe  │    3 │    3 │    8 │ 8 │
│ Dan  │    5 │    0 │    3 │ 5 │
└──────┴──────┴──────┴──────┴───┘

编辑

回答得好。我不认为对任意数量的列(没有dsql)有这样的方法吗?

有一种不使用动态SQL的方法:

代码语言:javascript
复制
SELECT DISTINCT t.*, c.s
FROM tab t
CROSS APPLY (VALUES(CAST((SELECT t.* for XML RAW) AS xml))) B(XMLData)
CROSS APPLY (SELECT MAX(a.value('.','INT') ) s
             FROM B.XMLData.nodes('/row')  AS C1(n)
             CROSS APPLY C1.n.nodes('./@*') AS C2(a)
             WHERE a.value('local-name(.)','varchar(100)') LIKE 'col%'
                     -- filtering based on name
                     -- it is also possible to JOIN and filter 
                     -- based on metadata like sys.columns
               ) C
ORDER BY s DESC;

DBFiddle演示

票数 5
EN

Stack Overflow用户

发布于 2018-06-20 19:33:06

我几乎从不在数据库上排序。在这种情况下,排序是复杂的,并且比您提供的模型更复杂,我通常会将数据从数据库中提取出来,然后用代码对其进行排序。

当我这样做的时候,我总是得到更多的奖励。在内存中对8000000行进行排序比在数据库中排序要便宜得多。由于您的数据模型很复杂,编写一种算法来对其进行排序比编写sql更灵活--您可以编写抵抗模式更改的代码,并将继续遵守您的规则。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50955509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档