我是postgresql的新手,我在postgresql中有这样的表T:
@model IEnumerable<ProgrammerGallery.Controllers.DataViewModel>
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<link href="~/bootstrap.min.css" rel="stylesheet" />
<title>Data page</title>
</head>
<body>
<div class="container">
<div id="accordion">
@{int counter = 0; }
@foreach (var dataVM in Model)
{
<div class="card">
<div class="card-header" id="heading@(counter)">
<h5 class="mb-0">
<button class="btn btn-link" data-toggle="collapse" data-target="#collapse@(counter)" aria-expanded="true" aria-controls="collapse@(counter)">
@dataVM.Title
</button>
</h5>
</div>
<div id="collapse@(counter)" class="collapse" aria-labelledby="heading@(counter)" data-parent="#accordion">
<div class="card-body">
<ul class="list-group">
@foreach (var item in dataVM.Data)
{
<li class="list-group-item">@($"Name :{item.Name}, {item.BriefDescription}, {item.Price}$")</li>
}
</ul>
</div>
</div>
</div>
counter++;
}
</div>
</div>
<script src="~/jquery.min.js"></script>
<script src="~/bootstrap.bundle.min.js"></script>
</body>
</html>
C1,C2,C4是整数 C3是一个char C4本质上是版本号。并且可以是1-N之间的任何东西 (例如,在一组插入事件之后,表中的值将更新。) ID是一个字符。
问题:
对于给定的ID值,我想选择具有最高C4的所有行。例如,表格中可能有N个版本,
我希望所有结果都对应于版本N.
我试过了,
C1 C2 C3 C4 ID
但它给了我错误。
请指教。
答案 0 :(得分:1)
如果同一版本号可以有多行,则在cte中使用窗口函数RANK
并选择rank等于1的行
SELECT id, c1, c2, c3, c4
FROM (
SELECT
*
, RANK() OVER (PARTITION BY id ORDER BY c4 DESC) c4rank
FROM t
) ranked
WHERE c4rank = 1
AND id = 'something'
如果您想要所有ID的最新版本,请忽略上述声明中的条件id = 'something'
。
如果给定版本号只能有1行,则使用order by并限制1
SELECT id, c1, c2, c3, c4
FROM t
WHERE id = 'something'
ORDER BY c4 DESC
LIMIT 1
如果您想要所有ID的最新版本&amp;每个(id,版本)组合只能有1行
SELECT DISTINCT ON (id) id, c1, c2, c3, c4
FROM t
WHERE id = 'something'
ORDER BY id, c4 DESC