我可以为聚合函数排序数据吗?

时间:2015-02-24 15:13:43

标签: sql-server sql-server-2012

我有一个自定义CLR聚合函数。此函数在一个组内串联字符串。现在的问题是,我可以使这个函数以某种特定的顺序处理数据,还是它始终是DB发现适合的随机顺序?我理解,对于大多数数学集合函数(MIN,MAX,AVG等),数据的处理顺序没有区别,但是我想说我想在一个组内按字母顺序连接字符串是否有我可以做的事情要做到这个结果吗?

请注意, 是一个聚合函数(不要通过下面的示例误导)并且改变现有的CLR函数是不可能的(所有它都是是一个基本的字符串concat,仅此而已)

我测试了将ORDER BY添加到包含SELECT的{​​{1}},但没有产生任何有意义的结果。

GROUP BY

在执行SELECT user.Id, dbo.concat(cat.Name) FROM Users user JOIN Cats cat ON (cat.Owner = user.Id) GROUP BY user.Id ORDER BY user.Id, MAX(cat.Name) --kind of meaningless really 之前,我还尝试ORDER BY包含我要连接的数据的表,但结果是一样的。

JOIN

在子查询中对数据进行排序,然后执行SELECT user.Id, dbo.concat(cat.Name) FROM Users user JOIN (SELECT TOP 100 PERCENT /*hack*/ c.* FROM Cats c ORDER BY c.Name) cat ON (cat.Owner = user.Id) GROUP BY user.Id 也无法正常工作。

GROUP BY

我有点期待这些都不会起作用,但至少现在没有人可以说我没有尝试过任何东西。

P.S。是的,我有理由不使用SELECT t1.Id, dbo.concat(t1.Name) FROM ( SELECT TOP 100 PERCENT /*hack*/ user.Id, cat.Name FROM Users user JOIN Cats cat ON (cat.Owner = user.Id) ORDER BY user.Id, cat.Name ) t1 GROUP BY t1.Id 。如果我在这里提出的要求无法完成,我会忍受它。

2 个答案:

答案 0 :(得分:0)

根据Damien_The_Unbeliever,Vladimir Baranov,微软网页以及其他一些用户(请参阅问题评论)的信息,我可以推断出:

  • 无法直接在数据库中对聚合函数进行排序;但是,有一些提示可能是\可能是计划的功能(请参阅herehere);如果MS实现了这一点,一些现有的CLR聚合函数可能会开始表现得很奇怪(因为默认情况下这些聚合函数被标记为依赖于顺序)
  • 订购必须直接在CLR功能中实现;它可能有点棘手due to how CLR aggregate functions are being run,但可以完成

不幸的是,我没有在这里提供一段代码,因为我没有时间来改变我的CLR功能(在我的情况下做无序连接就足够了)。

答案 1 :(得分:-1)

您可以在order by子句中包含一个函数。

尝试使用这个假日期回归者:

create function testDate ()
returns datetime
as
begin
    declare @returnDate datetime
    select @returnDate = CURRENT_TIMESTAMP

    return @returnDate
end

使用任何表运行该函数(将SomeTable替换为真实表)并按顺序运行:

select  dbo.testDate (),
        *
from    SomeTable
order by dbo.testDate () desc

@jahu 编辑:我以为你想通过用户定义的函数来订购。也许我误解了这个问题。您可以通过聚合函数订购查询,如下所示:

select  CustomerID,
        avg(OrderID)
from    Orders
group by CustomerID 
order by avg(OrderID) desc

上表将OrderID作为唯一列,并且可以有多个CustomerID记录