在F#中对序列进行分组和过滤

时间:2015-11-10 14:40:02

标签: f#

我有一些来自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行,每行{{1} }由最大值过滤日期表示一次。

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

有没有人有任何想法?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

首先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))

s |> filterLatest

在FSI:

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"}]

产生预期的

$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('categories');