2010-05-13 90 views
2

各「類型」的日期獲得的最後一個元素想象到有一個表定義爲如何通過LINQ或TSQL

CREATE TABLE [dbo].[Price](
    [ID] [int] NOT NULL, 
    [StartDate] [datetime] NOT NULL, 
    [Price] [int] NOT NULL 
) 

其中ID是具有一定價格的動作的標識符。如果需要,可以通過添加具有相同ID,不同價格和更新日期的新行來更新此價格。

與像

一組數據的

ID起始日期價格

1 01/01/2009 10 
1 01/01/2010 20 
2 01/01/2009 10 
2 01/01/2010 20 

如何獲得一組類似下面的

所以呢?

1 01/01/2010 20 
2 01/01/2010 20 

回答

2

在SQL中,有幾種方式可以說。下面是一個使用子查詢:

SELECT * 
    FROM Price p 
WHERE NOT EXISTS (
     SELECT * 
      FROM Price 
     WHERE ID = p.ID 
      AND StartDate > p.StartDate 
     ) 

這意味着相當平凡到LINQ:

var q = from p in ctx.Price 
     where !(from pp in ctx.Price 
       where pp.ID == p.ID 
        && pp.StartDate > p.StartDate 
       select pp 
       ).Any() 
     select p; 

或者我應該說,我認爲它。我現在不在VS前面,所以我無法驗證這是否正確,或者LINQ能夠將它轉換爲SQL。

小問題:請勿使用名稱ID來存儲非唯一值(在本例中爲類型)。這很混亂。

+0

表列名字被簡化了問題的清晰度:) – Mauro 2010-05-13 10:47:07

+0

儘管你說你已經爲了這個問題改變了列名,但我認爲我會擴展Marcelo關於ID很混亂的建議(如果它幫助其他人在看這個問題上)。名稱'ID'通常用於表的主鍵,在這種情況下,它不是主鍵(儘管它是組合鍵的一部分)。然而,它所涉及的問題是「行動」表的外鍵,因此可能更適合將其命名爲「ActionID」。 這當然只是我的意見;-) – belugabob 2010-05-13 10:53:35

+0

嘗試了你的LINQ查詢。奇蹟般有效!謝謝 – Mauro 2010-05-13 11:22:55

1

假設ID &起始日期將是唯一的:

SELECT p.ID, p.StartDate, p.Price 
FROM Price p 
    JOIN 
    (
     SELECT ID, MAX(StartDate) AS LatestDate 
     FROM Price 
     GROUP BY ID 
    ) p2 ON p.ID = p2.ID AND p.StartDate = p2.LatestDate 
1

既然你LINQ to SQL標記你的問題,這裏是一個LINQ查詢來表達你想要什麼:

from price in db.Prices 
group price by price.Id into group 
let maxDateInGroup = group.Max(g => g.StartDate) 
let maxDatePrice = group.First(g => g.StartDate == maxDateInGroup) 
select 
{ 
    Id = group.Key, 
    StartDate = maxDatePrice.StartDate, 
    Price = maxDatePrice.Price 
};