gpt4 book ai didi

F# 查询加入/组/聚合?

转载 作者:行者123 更新时间:2023-12-02 21:27:37 25 4
gpt4 key购买 nike

如何让 F# 执行相当于

select a.id, avg(case when a.score = b.score then 1.0 else 0.0 end)
from table1 a join table2 b on a.id = b.id and a.date = b.date
group by a.id

在查询表达式中?我想出了

query {
for a in db.table1 do
join b in db.table2 on ((a.id, a.date) = (b.id, b.date))
groupBy a.id into g
select (g.Key, ???) }

但我不知道要在“???”中插入什么。更糟糕的是,“分数”列可能为空,这使数学变得复杂。

或者,有没有更简单的方法来做到这一点?我对 .NET 数据库访问不太熟悉。理想情况下,我只是给它一个 SQL block ,它会解析它,并返回一些类型化的数据。事实上,尝试找出简单 SQL 的非 SQL 语法是相当令人沮丧的。

最佳答案

与 native F# 函数相比,SQL 转换通常可以更好地处理 C# 样式的 LINQ 操作。所以使用 Select 更容易和Average与标准 F# 函数(如 Seq.map)相比的扩展方法和Seq.average

我尝试使用示例 Northwind 数据库编写类似的分组 - 我没有找到合适的表来连接,但以下使用 CASE 进行基本聚合并且工作正常:

open System.Linq

query {
for p in db.Products do
groupBy p.CategoryID.Value into g
select (g.Key, g.Select(fun a ->
if a.UnitPrice.Value > 10.0M then 1.0 else 0.0).Average()) }
|> Array.ofSeq

它生成一个稍微复杂一点的查询,但看起来正确(并在 SQL 端使用 CASE)。你可以通过设置 db.DataContext.Log <- System.Console.Out 来看到。 .

通常应该起作用的另一件事是使用嵌套查询,但我还没有尝试过。

关于F# 查询加入/组/聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23132974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com