我有一些与下面的数据集相似的东西...
ID RowNumber
101 1
101 2
101 3
101 4
101 5
101 1
101 2我想要得到的是一个额外的专栏,如下所示…
ID RowNumber New
101 1 1
101 2 1
101 3 1
101 4 1
101 5 1
101 1 2
101 2 2我曾尝试过使用dense_rank(),但没有这么幸运。
发布于 2019-08-08 19:50:38
戈登已经提到,您需要一个列来指定数据的顺序。如果我将ID视为按列排序,下面的逻辑可能会帮助您获得您想要的结果-
WITH your_table(ID,RowNumber)
AS
(
SELECT 101,1 UNION ALL
SELECT 101,2 UNION ALL
SELECT 101,3 UNION ALL
SELECT 101,4 UNION ALL
SELECT 101,5 UNION ALL
SELECT 101,1 UNION ALL
SELECT 101,2
)
SELECT A.ID,A.RowNumber,
SUM(RN) OVER
(
ORDER BY ID
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) +1 New
FROM
(
SELECT *,
CASE
WHEN LAG(RowNumber) OVER(ORDER BY ID) > RowNumber THEN 1
ELSE 0
END RN
FROM your_table
)A如果RowNumber中的值比前一个值减少,则上面的值将始终更改行号。或者,如果您想在找到值1时更改行号,也可以实现相同的输出。这是位静态选项-
SELECT A.ID,A.RowNumber,
SUM(RN) OVER
(
ORDER BY ID
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) New
FROM(
SELECT *,
CASE
WHEN RowNumber = 1 THEN 1
ELSE 0
END RN
FROM your_table
)A 输出是-
ID RowNumber New
101 1 1
101 2 1
101 3 1
101 4 1
101 5 1
101 1 2
101 2 2发布于 2019-08-08 19:16:02
SQL表格表示无序集合。除非列指定了排序,否则没有排序。
假设您有这样一个列,您可以通过简单地计算每个点的"1“数来执行您想要的操作:
select t.*,
sum(case when rownumber = 1 then 1 else 0 end) over (partition by id order by <ordering column>) as new
from t;发布于 2019-08-08 23:22:04
正如戈登提到的,在您的示例中没有默认顺序,因此很难想象如何获得确定性结果(例如,将相同的值提供给相同的查询总是导致完全相同的答案。)
该样本数据包括一个连续的PK列,用于定义该集合的顺序。
DECLARE @tbl TABLE (PK INT IDENTITY, ID INT, RowNumber INT)
INSERT @tbl(ID, RowNumber) VALUES (101,1),(101,2),(101,3),(101,4),(101,5),(101,1),(101,2);
SELECT t.* FROM @tbl AS t;返回:
PK ID RowNumber
----- ------ -----------
1 101 1
2 101 2
3 101 3
4 101 4
5 101 5
6 101 1
7 101 2此查询使用DENSE_RANK为您提供所需的内容:
DECLARE @tbl TABLE (PK INT IDENTITY, ID INT, RowNumber INT)
INSERT @tbl(ID, RowNumber) VALUES (101,1),(101,2),(101,3),(101,4),(101,5),(101,1),(101,2);
SELECT t.ID, t.RowNumber, New = DENSE_RANK() OVER (ORDER BY t.PK - RowNumber)
FROM @tbl AS t;返回:
ID RowNumber New
----- ----------- ------
101 1 1
101 2 1
101 3 1
101 4 1
101 5 1
101 1 2
101 2 2请注意,ORDER BY New不影响计划。
https://stackoverflow.com/questions/57411270
复制相似问题