我有以下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过滤上述内容。
答案 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
)