聚合函数 - 自定义顺序中的第一个 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的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer如何用Sql语句自定义聚合函数

Terra R - 使用自定义函数加速栅格数据的聚合()

sql server 中的自定义函数应该如何调用?

Spark SQL自定义函数

如何在pyspark中的聚合函数之后保持列的顺序一致

Flink Table API & SQL 自定义 Aggregate 聚合函数