代码之家  ›  专栏  ›  技术社区  ›  Mauro

如何按LINQ或TSQL中每个“类型”的日期获取最后一个元素

  •  2
  • Mauro  · 技术社区  · 15 年前

    假设有一个表定义为

    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
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   Marcelo Cantos    15 年前

    在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 存储非唯一值(在本例中为类型)。这让人困惑。

        2
  •  1
  •   AdaTheDev    15 年前

    假设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
    
        3
  •  1
  •   Steven    15 年前

    因为你把你的问题 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
    };