postgresql选择一列中具有最大值的所有行

时间:2018-04-25 20:06:49

标签: database postgresql

我是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

但它给了我错误。

请指教。

1 个答案:

答案 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