2012年7月2日 星期一

{SQL& Linq} 取得某群組資料中日期最大

條件:
在一Table中有多個群組類別資料,取每一類別中日期最大的

sql:

select * from (
select b.* ,ROW_NUMBER() over (partition by b.商品類別 order by b.價格生效日 desc)as Sort 
from (select * from 商品類別價格Table where DATEDIFF(DAYOFYEAR, 價格生效日 ,GETDATE())>0) b)a
where a.Sort='1'

解說:
從上一SQL可發現同一種商品類別會有多個價格生效日,上一列子要取出生效日在今天(不含今天)以前日期最接近今天的一筆

SQL轉成Linq:

 var query=context.商品類別價格Table.Where(s=>System.Data.Linq.SqlClient.SqlMethods.DateDiffDay(s.價格生效日,DateTime.Now)>0).ToList().OrderByDescending(s => s.價格生效日).GroupBy(s => 商品類別).Select(
                    b => new {b, cout = b.Count()}).SelectMany(
                        c =>
                        c.b.Select(d => d).Zip(Enumerable.Range(1, c.cout),
                                               (j, i) => new  { j.PriceId, j.商品類別, j.價格生效日, Sort = i })).Where(s => s.Sort == 1).ToList();


參考資料:
http://pastebin.com/7SCG76uW

Zip用法...
http://msdn.microsoft.com/zh-tw/library/dd267698.aspx