【问题标题】:Grouping and filtering a sequence in F#在 F# 中对序列进行分组和过滤
【发布时间】:2015-11-10 14:40:01
【问题描述】:

我有一些来自 SQL dB 的数据,看起来类似于

recordID value date    
A        4     11/20/14
A        1     11/25/14
B        5     01/10/15
B        2     01/20/15
C        10    11/20/14
C        3     11/25/14
C        5     11/30/14

但有数万行。

我的目标是,对于每个recordID,在应用日期过滤器后保留与最新日期对应的行。

我可以很容易地用

过滤数据
let filteredData = table 
                |> Seq.filter (fun x -> System.DateTime.Compare(x.Date.Value, convertStringToDate "1/15/15")) <= 0)

(函数convertStringToDateSystem.DateTime.Parse的包装器。)

上面的let 语句返回一个行序列,其中仅包括等于或在"1/15/15" 之前的行,但我最终需要的是一个dB 行序列,其中每个recordID 由它表示一次最大,过滤日期。

我怀疑我会以某种方式使用Seq.groupBy,但作为F# 的一个相对较新的用户,我不知道如何在这里使用它。 I did not find the Seq.groupBy example on the MSDN page very helpful.

有人有什么想法吗?感谢您的帮助。

【问题讨论】:

    标签: f#


    【解决方案1】:

    首先你groupBy你的记录是recordID,它给你一个序列的每个recordId。然后在后面的每个序列中,您删除组键并过滤掉所有,但最新的记录实例date

    type Row = {recordID: string; value: int; date: DateTime}
    
    let s = seq {
                yield {recordID = "A"; value = 4; date = DateTime.Parse "11/20/2014"}
                yield {recordID = "A"; value = 1; date = DateTime.Parse "11/25/2014"}
                yield {recordID = "B"; value = 5; date = DateTime.Parse "1/10/2015"}
                yield {recordID = "B"; value = 2; date = DateTime.Parse "1/20/2015"}
            }
    
    let filterLatest ss =
        ss
        |> Seq.groupBy (fun x -> x.recordID)
        |> Seq.map (snd >> Seq.maxBy (fun x -> x.date))
    

    在 FSI 中:

    s |> filterLatest
    

    产生预期的效果

    seq [{recordID = "A"; value = 1; date = "11/25/2014 12:00:00 AM"};
         {recordID = "B"; value = 2; date = "1/20/2015 12:00:00 AM"}]
    

    【讨论】:

    • 完美。效果很好!
    猜你喜欢
    • 2022-06-20
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多