Как получить последний элемент по дате каждого «типа» в LINQ или TSQL - PullRequest
2 голосов
/ 13 мая 2010

Представьте, что таблица определена как

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

где ID - идентификатор действия, имеющего определенную цену. При необходимости эту цену можно обновить, добавив новую строку с тем же идентификатором, другой ценой и более новой датой.

Таким образом, с набором данных, таких как

ID StartDate Цена

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

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

В 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 для хранения неуникального значения (типа, в данном случае).Это сбивает с толку.

1 голос
/ 13 мая 2010

Поскольку вы отметили свой вопрос с помощью 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
};
1 голос
/ 13 мая 2010

Предполагается, что ID и StartDate будут уникальными:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...