gpt4 book ai didi

sql - 通过重新排序行和列来对二维表进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:14:10 24 4
gpt4 key购买 nike

是否可能,如果可以,如何对二维表进行排序,通过对列和行重新排序,并且仅使用这两个操作,该表的最大数字集中在左上角?任何帮助将不胜感激。

例如,我们可以使用这张表:

     Column 1 Column 2 Column 3
Row 1 2 4 5
Row 2 3 2 6
Row 3 7 2 6

结果我想是这样的,但我不确定:

     Column 1 Column 2 Column 3
Row 1 7 6 2
Row 2 3 6 2
Row 3 2 5 4

目前,我只考虑对行和列求和并将它们排序为从左上降序。

最佳答案

在涉及到矩阵操作时,更多的是 MatLab 专家,但这也许会有所帮助。

这里我们使用 TVF 来创建动态 EAV 结构。一个函数用不了,内联也是小事。

此外,如果需要,最终枢轴可以是动态的

示例

Declare @YourTable table (Column1 int,Column2 int,Column3 int)
Insert Into @YourTable values
(2,4,5),
(3,2,6),
(7,2,6)

;with cte as (
Select RowNr=Dense_Rank() over (Order By RowTotal Desc,Entity )
,ColNr=Dense_Rank() over (Order By ColTotal Desc,Attribute)
,Value
From (
Select *
,RowTotal = max(cast(Value as float)) over(Partition By Entity)
,ColTotal = max(cast(Value as float)) over(Partition By Attribute)
From [dbo].[udf-EAV]((Select RN=Row_Number() over (Order By (Select null)),* From @YourTable for XML RAW))
) A
)
Select [1] Col1,[2] Col2,[3] Col3
From cte
Pivot (max(Value) For [ColNr] in ([1],[2],[3]) ) p

返回

Col1    Col2    Col3
7 6 2
3 6 2
2 5 4

UDF(如果有兴趣)

CREATE FUNCTION [dbo].[udf-EAV](@XML xml)
Returns Table
As
Return (
with cteKey(k) as (Select Top 1 xAtt.value('local-name(.)','varchar(100)') From @XML.nodes('/row') As A(xRow) Cross Apply A.xRow.nodes('./@*') As B(xAtt))

Select Entity = xRow.value('@*[1]','varchar(50)')
,Attribute = xAtt.value('local-name(.)','varchar(100)')
,Value = xAtt.value('.','varchar(max)')
From @XML.nodes('/row') As A(xRow)
Cross Apply A.xRow.nodes('./@*') As B(xAtt)
Where xAtt.value('local-name(.)','varchar(100)') Not In (Select k From cteKey)
)
-- Notes: First Field in Query will be the Entity
-- Select * From [dbo].[udf-EAV]((Select UTCDate=GetUTCDate(),* From sys.dm_os_sys_info for XML RAW))

关于sql - 通过重新排序行和列来对二维表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43681765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com