【问题标题】:Get maximum of sequence获取最大序列
【发布时间】:2020-10-25 10:13:14
【问题描述】:
+----+-------+
| id | value | 
+----+-------+
|  1 |    A  |
|  2 |    B  |
|  3 |    C  |
|  4 |    D  |
|  5 |    D  |
|  6 |    D  |
|  7 |    N  |
|  8 |    P  |
|  9 |    P  |
+----+-------+

期望的输出

+----+-------+---------------------+
| id | value |      calc ↓         |
+----+-------+---------------------+
|  1 |    A  |          1          |
|  2 |    B  |          2          |
|  3 |    C  |          3          |
|  4 |    D  |          6          |
|  5 |    D  |          6          |
|  6 |    D  |          6          |
|  7 |    N  |          7          |
|  8 |    P  |          9          |
|  9 |    P  |          9          |
| 10 |    D  |          11         |
| 11 |    D  |          11         |
| 12 |    Z  |          12         |
+----+-------+---------------------+

你能帮我解决这个问题吗? id 是标识,id 必须存在于输出中,输出中必须有相同的 9 行。

新注释:我添加了第 10、11、12 行。请注意,带有字母“D”的 id 10 和 11 与 id 4、5、6 位于不同的组中

谢谢

【问题讨论】:

  • 提示:MAX() OVER()。请使用您正在使用的 DBMS 标记您的问题,例如:SQL Srever、MySQL、Oracle ..
  • 我不清楚为什么问题的一部分要求结果集中有 9 行,而另一部分显示 12 行。添加了另外三行,它们的含义尚不清楚。我的建议是你提出一个新问题,明确你想要什么,并添加一个合适的数据库标签。

标签: sql window-functions gaps-and-islands


【解决方案1】:

如果分组也依赖于周围的 id,那么这就变成了类似于间隙和孤岛问题https://www.red-gate.com/simple-talk/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/#:~:text=The%20SQL%20of%20Gaps%20and%20Islands%20in%20Sequences,...%204%20Performance%20Comparison%20of%20Gaps%20Solutions.%20

您可以使用 Tabibitosan 方法https://rwijk.blogspot.com/2014/01/tabibitosan.html

在这里,您还需要按值列进行分组,但这不会太复杂:

select id, value, max(id) over (partition by value, island) calc
from (
select id, value, id - row_number() over(partition by value order by id) island
from my_table
) as sq
order by id;

id - row_number() over(partition by value order by id) 表达式为您提供一个数字,每次 ID 值的每个值变化超过 1 时,该数字都会发生变化。这包含在 max(id) over (partition by value, island) 表达式中。岛号仅对该特定值有效。在您的情况下,值 N 和 D 的计算岛数均为 6,但需要以不同方式考虑。

Db-fiddle https://www.db-fiddle.com/f/jahP7T6xBt3cpbLRhZZdQG/1

【讨论】:

    【解决方案2】:

    对于这个示例日期,您需要 MAX() 窗口函数:

    SELECT id, value,
           MAX(id) OVER (PARTITION BY value) calc
    FROM tablename
    

    【讨论】:

    • 新注释:我添加了第 10、11、12 行。请注意,带有字母“D”的 id 10 和 11 与 id 4,5,6 位于不同的组中
    • @lozin 此代码回答了您发布的问题。如果您的要求不同,您可以发布一个新问题。
    【解决方案3】:
    SELECT id, value, (SELECT max(id) FROM TABLE inner where inner.value = outer.value)
    FROM table as outer
    

    【讨论】:

    • 新注释:我添加了第 10、11、12 行。请注意,带有字母“D”的 id 10 和 11 与 id 4、5、6 位于不同的组中
    猜你喜欢
    • 2014-12-21
    • 2013-05-25
    • 2019-10-23
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多