sql - 根据每行的顺序添加行号
问题描述
我有一张这样的桌子
id, period, tag
1 1 A
1 2 A
1 3 B
1 4 A
1 5 A
1 6 A
2 1 A
2 2 B
2 3 B
2 4 B
2 5 B
2 6 A
我想添加一个带有排名的新列,尊重给定我的列“句点”的行的顺序以获得类似的东西
id, period, tag rank
1 1 A 1
1 2 A 1
1 3 B 2
1 4 A 3
1 5 A 3
1 6 A 3
2 1 A 1
2 2 B 2
2 3 B 2
2 4 B 2
2 5 B 2
2 6 A 3
我能做些什么?
我尝试 rank 和 dense_rank 函数没有任何成功
解决方案
另一个 CONDITIONAL_CHANGE_EVENT() 的候选代码更少,而且非常有效……!
WITH
input(id,period,tag) AS (
SELECT 1,1,'A'
UNION ALL SELECT 1,2,'A'
UNION ALL SELECT 1,3,'B'
UNION ALL SELECT 1,4,'A'
UNION ALL SELECT 1,5,'A'
UNION ALL SELECT 1,6,'A'
UNION ALL SELECT 2,1,'A'
UNION ALL SELECT 2,2,'B'
UNION ALL SELECT 2,3,'B'
UNION ALL SELECT 2,4,'B'
UNION ALL SELECT 2,5,'B'
UNION ALL SELECT 2,6,'A'
)
SELECT
*
, CONDITIONAL_CHANGE_EVENT(tag) OVER(PARTITION BY id ORDER BY period) + 1 AS rank
FROM input;
-- out id | period | tag | rank
-- out ----+--------+-----+------
-- out 1 | 1 | A | 1
-- out 1 | 2 | A | 1
-- out 1 | 3 | B | 2
-- out 1 | 4 | A | 3
-- out 1 | 5 | A | 3
-- out 1 | 6 | A | 3
-- out 2 | 1 | A | 1
-- out 2 | 2 | B | 2
-- out 2 | 3 | B | 2
-- out 2 | 4 | B | 2
-- out 2 | 5 | B | 2
-- out 2 | 6 | A | 3
-- out (12 rows)
-- out
-- out Time: First fetch (12 rows): 14.823 ms. All rows formatted: 14.874 ms
推荐阅读
- reactjs - 'handleOptionsChange' 没有在 ReactJS 中定义为 no-undef
- firebase - 我可以在 Firestore 中同时添加多个文档吗?
- mysql - 为什么 mySQL 中的“IN”不能正确过滤数据?
- assembly - 我无法在模式 2 中锁定和读取 8253 计数器
- r - 多个(非生物、离散状态)序列的比对
- javascript - classList.remove 似乎崩溃了
- sql - SQL -- 显示每个部门的第二高薪水,如果员工的薪水相同,则显示empno最低的薪水
- haskell - Map.lookup 被定义为在任何 monad 中工作
- c# - 有没有办法拆分数组中的每个字符串并每次检索第 5 位,加到总数中?
- python - 用于 Python 3 但不是 Python 2 (Mac OSX) 的 Jupyter Notebook 中的 ModuleNotFoundError