Pages - Menu

2020年8月18日 星期二

[c#]Linq lambda實做 sql ROW NUMBER

前言

最近幫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 

}



 

 

沒有留言:

張貼留言