聚合函数 - 自定义顺序中的第一个 nvarchar
Posted
技术标签:
【中文标题】聚合函数 - 自定义顺序中的第一个 nvarchar【英文标题】:Aggregate Function - First nvarchar in custom order 【发布时间】:2013-09-14 06:20:57 【问题描述】:我有一个包含以下数据的表格:
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 聚合函数与 group by 一起使用,它将按字母顺序返回第一个 AssumedDataType,这将不起作用。
【问题讨论】:
“高位”是不是排名的最小值,因为你想要的结果不一致。例如,您为 Id 43265 选择了排名为 2 的行(当有另一个排名为 10 时),但您为 Id 43266 选择了排名为 10 的行(当有另一个排名为 2 时)。 你是对的,我做出了改变。 【参考方案1】:你想使用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
子句确定。因此,此构造将“1”分配给每个 TableColumnsId 排名最高的行——where
子句选择此值。
【讨论】:
您需要删除排名上的说明。排名越低越好。它不会让我编辑,因为它少于 6 个字符的变化。 @Rafi。 . .我做出了改变。我确实想指出,代码说“摘要 AssumedDataType 应该是排名较高的那个”,这就是我使用desc
的原因。【参考方案2】:
试试这个:
SELECT TableColumnsId, AssumedDataType, Ranking
FROM T t1
WHERE Ranking =
(SELECT MIN(Ranking)
FROM T t2
WHERE t1.TableColumnsId = t2.TableColumnsId);
【讨论】:
【参考方案3】:这里我选择排名最高的 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
【讨论】:
以上是关于聚合函数 - 自定义顺序中的第一个 nvarchar的主要内容,如果未能解决你的问题,请参考以下文章