我有一张包含以下数据的表格:
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,这将无效。
答案 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);