Moo*_*one 3 sql t-sql sql-server
通过查看每行中最大的列值来排序查询的最有效方法是什么?
例如:
Dan | 5 | 0 | 3
Moe | 0 | 9 | 2
Joe | 3 | 3 | 8
Run Code Online (Sandbox Code Playgroud)
对此数据集进行排序应返回:Moe,Joe,Dan
我的数据集比上面的更复杂,所以我试图避免任何子查询与group by max的组合.
你可以使用CROSS APPLY:
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;
Run Code Online (Sandbox Code Playgroud)
输出:
?????????????????????????????????
? name ? col1 ? col2 ? col3 ? c ?
?????????????????????????????????
? Moe ? 0 ? 9 ? 2 ? 9 ?
? Joe ? 3 ? 3 ? 8 ? 8 ?
? Dan ? 5 ? 0 ? 3 ? 5 ?
?????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
很好的答案.我不认为有任何方法可以为任意数量的列(没有dsql)执行此操作吗?
有一种没有动态SQL的方法:
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;
Run Code Online (Sandbox Code Playgroud)