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

时间:2017-04-28 13:45:40

标签: sql sql-server algorithm

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

例如,我们可以使用此表:

     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

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

1 个答案:

答案 0 :(得分:1)

更多关于矩阵操作的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))