【问题标题】:Filter SQL Server data according to its max value根据最大值过滤 SQL Server 数据
【发布时间】:2020-08-20 22:32:29
【问题描述】:

我有一个 SQL Server 2008 表,例如:

    +------+-------+--------------------------------------+
    | id   | level | content                              |
    +------+-------+--------------------------------------+
    | 1    | 1     | ...                                  |
    | 2    | 2     | ...                                  |
    | 1    | 2     | ...                                  |
    | 1    | 3     | ...                                  |
    | 2    | 1     | ...                                  |
    | 1    | 4     | ...                                  |
    | 3    | 1     | ...                                  |
    +------+-------+--------------------------------------+

对于每个 id,它可能有三个、两个或四个级别保存在上面的表格中。如何获取每个 id 的数据:

  1. 每个id在final table中最多有3条记录
  2. 如果一个id的最大级别大于3,则三个记录的级别从max到max-3;
  3. 如果一个 id 的最大级别等于或小于 3,则保持原样。

所以我想要的决赛桌是:

    +------+-------+--------------------------------------+
    | id   | level | content                              |
    +------+-------+--------------------------------------+
    | 1    | 1     | ...                                  |
    | 2    | 2     | ...                                  |
    | 1    | 2     | ...                                  |
    | 1    | 3     | ...                                  |
    | 2    | 1     | ...                                  |
    | 3    | 1     | ...                                  |
    +------+-------+--------------------------------------+

我怎样才能划线?非常感谢。

【问题讨论】:

  • 请向我们展示您的尝试。

标签: sql sql-server greatest-n-per-group window-functions


【解决方案1】:

我认为您想要每个 id 的 3 个最新 levels。如果是这样,您可以像这样使用窗口函数:

select *
from (
    select t.*, row_number() over(partition by id order by level desc) rn
    from mytable t
) t
where rn <= 3

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多