首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DENSE_RANK()查询

DENSE_RANK()查询
EN

Stack Overflow用户
提问于 2019-08-08 19:13:21
回答 4查看 100关注 0票数 0

我有一些与下面的数据集相似的东西...

代码语言:javascript
复制
ID        RowNumber
101       1
101       2
101       3
101       4
101       5
101       1
101       2

我想要得到的是一个额外的专栏,如下所示…

代码语言:javascript
复制
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(),但没有这么幸运。

EN

回答 4

Stack Overflow用户

发布于 2019-08-08 19:50:38

戈登已经提到,您需要一个列来指定数据的顺序。如果我将ID视为按列排序,下面的逻辑可能会帮助您获得您想要的结果-

代码语言:javascript
复制
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时更改行号,也可以实现相同的输出。这是位静态选项-

代码语言:javascript
复制
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 

输出是-

代码语言:javascript
复制
ID  RowNumber   New
101 1           1
101 2           1
101 3           1
101 4           1
101 5           1
101 1           2
101 2           2
票数 1
EN

Stack Overflow用户

发布于 2019-08-08 19:16:02

SQL表格表示无序集合。除非列指定了排序,否则没有排序。

假设您有这样一个列,您可以通过简单地计算每个点的"1“数来执行您想要的操作:

代码语言:javascript
复制
select t.*,
       sum(case when rownumber = 1 then 1 else 0 end) over (partition by id order by <ordering column>) as new
from t;
票数 0
EN

Stack Overflow用户

发布于 2019-08-08 23:22:04

正如戈登提到的,在您的示例中没有默认顺序,因此很难想象如何获得确定性结果(例如,将相同的值提供给相同的查询总是导致完全相同的答案。)

该样本数据包括一个连续的PK列,用于定义该集合的顺序。

代码语言:javascript
复制
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;

返回:

代码语言:javascript
复制
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为您提供所需的内容:

代码语言:javascript
复制
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;

返回:

代码语言:javascript
复制
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不影响计划。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57411270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档