前言
最近幫ARTC搞自動駕駛的車端資料分析,
之前都是先把原始資料丟SQL,再產生資料判斷比對。
但原始資料實在是太多了…
十分鐘,626,062 ,一趟有40-50分鐘,所以會有 3,130,310 筆資料。
3趟就能破千萬了,所以只能在測試的時候用。
正文
寫SQL的時候寫得很開心,
為了要篩選出每毫秒的第一筆資料,又要顯示成秒數,
所以用了
ROW_NUMBER() over(partition by CONVERT(CHAR(19), OccurDate, 20) order by
occurDate) as Row#
到了C#,我完全不知到該怎麼用LINQ表達出來。
最後是參考了Implementing RANK OVER SQL Clause in C# LINQ 才生出來。
但這篇文章內的內容有些我搞不清楚,
var rank = data.GroupBy(d => d.CategoryKey)
.SelectMany(g => g.OrderByDescending(y => y.Rate *
@BAES_RATE)
.Select((x,i) => new{g.Key, Item=x, Rank=i+1}))
selectMany什麼意思?
然後怎麼又用了(x,i)取值?
我資料在哪裡???
首先selectMany可以先看這篇 LINQ自學筆記-語法應用-取出資料-SelectMany 運算子
然後(x,i)的意思還是不懂,先把程式跑起來看看是什麼好了。
var gps = cars.Where(p =>
p.canID.Equals(41837))
.GroupBy(g =>
g.OccurDate.ToString("yyyy/mm/dd HH:MM:ss"))
.SelectMany(g =>
g.OrderBy(y => y.OccurDate)
.Select((p, i) => new {
g.Key, Item = p, Rank =
i + 1,
}));
這邊用的是 (p,i) ,一般我們都是使用 p=>p.xxx 的方式取值,
這邊則是將p宣告成一個物件丟進去。
所以可以看到資料變成了這樣(Fig.1),再往下的item(Fig.2)
(Fig.1)
(Fig.2)
但這樣出來的值,在item裡面,我不要這樣太麻煩了。
所以可以將
Item = p
改成
Item = new{
occurDate = p.OccurDate,
abc= p.byte0
}
0 意見:
張貼留言