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

SQL查询:只显示每组的最新Id

  •  1
  • kaka1234  · 技术社区  · 8 年前

    我有以下SQL表:

    Name       Description   Id   UserId   CreatedDate
    UserSet1   Desc1         1    Abc      06/01/2018
    UserSet1   Desc2         2    Def      06/02/2018
    UserSet2   Desc for 2    5    NewUser  06/04/2018
    UserSet2   Desc for 2    7    NewUser  06/19/2018
    

    我想从上表中提取的只是每个名称的最新Id,这样我就可以得到以下输出

    Name      Description    Id    UserId    CreatedDate
    UserSet1  Desc2          2     Def       06/01/2018
    UserSet2  Desc for 2     7     NewUser   06/19/2018
    

    由于Id 2&7是UserSet1&UserSet2表中的最新条目,所以我希望显示它而不是表中的所有条目。

    任何输入我怎样才能得到想要的结果。

    我对直接返回输出的解决方案或任何linq(C#)解决方案也持开放态度。Ie返回整个数据集,然后使用linq过滤上面的内容。

    4 回复  |  直到 8 年前
        1
  •  1
  •   Shawn    8 年前

    GROUP BY 方法可能更容易使用。

    SELECT *
    FROM (
        SELECT Name, Description, Id, UserId, CreatedDate
            , ROW_NUMBER() OVER (PARTITION BY Name ORDER BY CreatedDate DESC) AS rn
        FROM myTable
    ) s1
    WHERE rn = 1
    

    ROW_NUMBER()

        2
  •  1
  •   kaka1234    8 年前

    感谢大家指出正确的方向。我用下面的Linq和C代码实现了这个功能:

     var results = response.GroupBy(row => row.Name)
                       .SelectMany(g => g.OrderByDescending(row => row.Id).Take(1));
    

    对于最初的测试,这似乎是有效的。如果你认为有问题,请告诉我。

        3
  •  0
  •   Zorkolot    8 年前

    这应该是一个通用的SQL答案:

    SELECT * FROM yourtable Y1
    WHERE Id = (SELECT MAX(Id)
                  FROM yourtable Y2
                 WHERE Y2.Name = Y1.Name)
    
        4
  •  0
  •   user007    8 年前

    如果是MS SQL,您可以使用命令分区,否则最有效的方法是:

    select * from Table
    where Id in (
        select Max(Id) from Table
        Group By Name
    )
    

    不确定是否可以将Name排除在Select语句之外,您可能需要执行以下操作:

    select * from Table
    where Id in (
        Select Id from 
            (select Name, Max(Id) as Id from Table
            Group By Name)
    )