具有自定义聚合函数的 F# 查询表达式
F# query expression with a custom aggregate function
在我的项目中,我使用 F# query expression 来查询我的数据库。
下面的代码计算按“Key”列分组的平均值:
open System.Linq
query{
for row in ctx.MyTable do
groupBy row.MyKey into g
select (g.Key, g.Average(fun x -> x.MyValue))
}
我意识到对于我的项目来说,中位数比 Average
更好。问题是似乎不支持在数据库引擎上计算中位数。但是,我想避免获取所有行并计算内存中的中位数,因为它们太多了,我需要节省网络带宽。
这里有什么功能可以使用吗?或者我是否需要完全从头开始编写我自己的方法(如果是 - 如何)?
我的数据库引擎是 MSSQL,它包含一个 PERCENTILE_COUNT 函数,可能对我的情况有用。此外,我使用 EntityFramework Core 3,我注意到它包含一些辅助功能,如 EF.Functions.DateDiffMinute
,但我没有发现任何可以帮助我解决问题的东西。
我认为您无法使用 F# 查询表达式执行此操作,但您始终可以下拉到 Entity Framework 中的原始 SQL。下面是计算 Northwind 数据库中每个客户订单金额中位数的示例:
ctx.Orders.FromSqlRaw(
"select distinct \
CustomerID, \
percentile_cont(0.5) \
within group (order by Freight) \
over (partition by CustomerID) as FreightMedian \
from Orders")
在我的项目中,我使用 F# query expression 来查询我的数据库。
下面的代码计算按“Key”列分组的平均值:
open System.Linq
query{
for row in ctx.MyTable do
groupBy row.MyKey into g
select (g.Key, g.Average(fun x -> x.MyValue))
}
我意识到对于我的项目来说,中位数比 Average
更好。问题是似乎不支持在数据库引擎上计算中位数。但是,我想避免获取所有行并计算内存中的中位数,因为它们太多了,我需要节省网络带宽。
这里有什么功能可以使用吗?或者我是否需要完全从头开始编写我自己的方法(如果是 - 如何)?
我的数据库引擎是 MSSQL,它包含一个 PERCENTILE_COUNT 函数,可能对我的情况有用。此外,我使用 EntityFramework Core 3,我注意到它包含一些辅助功能,如 EF.Functions.DateDiffMinute
,但我没有发现任何可以帮助我解决问题的东西。
我认为您无法使用 F# 查询表达式执行此操作,但您始终可以下拉到 Entity Framework 中的原始 SQL。下面是计算 Northwind 数据库中每个客户订单金额中位数的示例:
ctx.Orders.FromSqlRaw(
"select distinct \
CustomerID, \
percentile_cont(0.5) \
within group (order by Freight) \
over (partition by CustomerID) as FreightMedian \
from Orders")