我有一些来自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)
(函数convertStringToDate
是System.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.
有没有人有任何想法?谢谢你的帮助。
答案 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');