tsql - 我需要一种在 T-SQL 上使用 ROW_NUMBER 无法计算的组排序
问题描述
我有一个 table_id 行和其他 2 行的表。我想要带有 row_number 函数的编号类型,我希望结果看起来像这样:
id |col1 |col2 |what I want
------------------------------
1 |x |a |1
2 |x |b |2
3 |x |a |3
4 |x |a |3
5 |x |c |4
6 |x |c |4
7 |x |c |4
请考虑一下;
- 只有一个 x,所以“
partition by col1
”是可以的。除此之外; - 有两个a的序列,它们将被单独计算
- (不是 1,2,1,1,3,3,3)。并且必须按 id 排序,而不是按 col2(所以
order by col2
不行)。
我希望这个数字在 col2 与上一行相比发生变化时增加一。
row_number () over (partition by col1 order by col2)
不工作。因为我希望它按 id 排序。
解决方案
使用LAG
和窗口COUNT
出现可以让你得到你所追求的:
WITH Previous AS(
SELECT V.id,
V.col1,
V.col2,
V.[What I want],
LAG(V.Col2,1,V.Col2) OVER (ORDER BY ID ASC) AS PrevCol2
FROM (VALUES(1,'x','a',1),
(2,'x','b',2),
(3,'x','a',3),
(4,'x','a',3),
(5,'x','c',4),
(6,'x','c',4),
(7,'x','c',4))V(id, col1, col2, [What I want]))
SELECT P.id,
P.col1,
P.col2,
P.[What I want],
COUNT(CASE P.Col2 WHEN P.PrevCol2 THEN NULL ELSE 1 END) OVER (ORDER BY P.ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +1 AS [What you get]
FROM Previous P;
推荐阅读
- oracle-apex-5 - 为什么模态对话框中的内容被截断?
- ios - 使用 xamarin 在 ios 中显示联系人地址
- javascript - 随机颜色到 SVG 矩形
- python - 将新项目添加到基于其他项目值控制的字典列表
- java - 在java中显示输入字符串有困难
- java - 我使用 ReentrantReadWriteLock 有什么问题?
- javascript - 传入事件Target ID JS时无法访问cellIndex
- docker-compose - Hyperledger - MSP 错误:提供的身份无效:x509:证书由未知机构签名
- android - 从嵌套的回收器视图中获取数据
- here-olp - 如何调查在创建日志 URL 之前失败的失败管道?