我有一个自定义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
。如果我在这里提出的要求无法完成,我会忍受它。
答案 0 :(得分:0)
根据Damien_The_Unbeliever,Vladimir Baranov,微软网页以及其他一些用户(请参阅问题评论)的信息,我可以推断出:
不幸的是,我没有在这里提供一段代码,因为我没有时间来改变我的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记录