SQL查询:仅显示每组中的最新ID

时间:2018-06-14 15:22:13

标签: c# sql linq amazon-dynamodb

我有以下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#)解决方案的解决方案持开放态度。即返回整个数据集,然后使用linq过滤上述内容。

4 个答案:

答案 0 :(得分:1)

编辑:由于您正在寻找最高编号的ID,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

我没有要测试的dynamoDB实例,但我相信它可以使用ROW_NUMBER()窗口函数。

答案 1 :(得分:1)

感谢大家指出正确的方向。我使用下面的Linq和C#代码:

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

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

答案 2 :(得分:0)

这应该是一般的SQL答案:

SELECT * FROM yourtable Y1
WHERE Id = (SELECT MAX(Id)
              FROM yourtable Y2
             WHERE Y2.Name = Y1.Name)

答案 3 :(得分:0)

如果是MS SQL,您可以使用Partition By命令,否则最常用的方式是:

public function onKernelException(GetResponseForExceptionEvent $event)
{
    if (! $event->getException() instanceof ErrorException) {
        return;
    }

    // handle your custom ErrorException
    $response = new Response();
    $response->setContent($event->getException()->getMessage());

    // sends the modified response object to the event
    $event->setResponse($response);
}

不确定是否可以将Name从Select语句中删除,您可能需要这样做:

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