获取序列的最大值
Get maximum of sequence
+----+-------+
| 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
在不同的组中
谢谢
SELECT id, value, (SELECT max(id) FROM TABLE inner where inner.value = outer.value)
FROM table as outer
对于这个示例日期,您需要 MAX() window 函数:
SELECT id, value,
MAX(id) OVER (PARTITION BY value) calc
FROM tablename
如果分组也依赖于周围的 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
+----+-------+
| 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
在不同的组中谢谢
SELECT id, value, (SELECT max(id) FROM TABLE inner where inner.value = outer.value)
FROM table as outer
对于这个示例日期,您需要 MAX() window 函数:
SELECT id, value,
MAX(id) OVER (PARTITION BY value) calc
FROM tablename
如果分组也依赖于周围的 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