聚合函数 - 自定义顺序中的第一个nvarchar

时间:2013-09-10 13:43:38

标签: sql-server sql-server-2008 aggregate-functions

我有一张包含以下数据的表格:

TableColumnsId  AssumedDataType     Ranking
43264           System_String       1
43265           System_Int32        2
43265           System_Double       10
43266           System_Double       10
43266           System_Int32        2
43267           System_Int32        2
43267           System_Double       10
43268           System_Double       9
43268           System_Int32        8
43268           System_String       9
43269           System_String       9
43269           System_Int32        7
43269           System_Double       10
43270           System_String       5
43271           System_String       1
43272           System_String       8
43272           System_Double       4

我想每个TableColumnsId只返回一列,而摘要AssumedDataType应该是排名较低的列。

因此上述数据应该成为:

TableColumnsId  AssumedDataType     Ranking
43264           System_String       1
43265           System_Int32        2
43266           System_Int32        2
43267           System_Int32        2
43268           System_Int32        8
43269           System_Int32        7
43270           System_String       5
43271           System_String       1
43272           System_Double       4

如果我将min aggregate函数与group一起使用,则按字母顺序返回第一个AssumedDataType,这将无效。

3 个答案:

答案 0 :(得分:3)

您想使用row_number()

select TableColumnsId, AssumedDataType, Ranking
from (select t.*, row_number() over (partition by TableColumnsId order by Ranking) as seqnum
      from t
     ) t
where seqnum = 1;

row_number()函数为每个组分配一个序号(由partition by子句定义)。组内的排序由order by子句确定。因此,此构造为每个TableColumnsId排名最高的行分配“1” - where子句选择此值。

答案 1 :(得分:0)

在这里,我选择排名最高的ColumnIds,然后将其与主表连接,以获取该columnId和排名的DataType:

with Rank_cte(ColumnId,Ranking)
as(Select TableColumnsId,Min(Ranking) from TableName Group By TableColumnID)

Select A.TableColumnsId,AssumedDataType,A.Ranking From TableName A join 
Rank_cte B on A.TableColumnsId=B.ColumnId and A.Ranking=B.Ranking

答案 2 :(得分:0)

试试这个:

SELECT TableColumnsId, AssumedDataType, Ranking
FROM T t1
WHERE Ranking =
    (SELECT MIN(Ranking)
    FROM T t2
    WHERE t1.TableColumnsId = t2.TableColumnsId);