Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 稠密秩()查询_Sql_Tsql_Dense Rank - Fatal编程技术网

Sql 稠密秩()查询

Sql 稠密秩()查询,sql,tsql,dense-rank,Sql,Tsql,Dense Rank,我有一些类似于下面的数据集 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

我有一些类似于下面的数据集

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
我曾经玩弄过稠密秩,但没有这种运气。

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;

Gordon已经提到,您需要一个列来指定数据的顺序。如果我认为ID是按列排序的,下面的逻辑可以帮助你得到你想要的结果-< /p>
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时更改行号,也可以实现相同的输出alsoo。这是位静态选项-

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

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

此示例数据包括一个顺序PK列,用于定义此集合的顺序

返回:

此查询使用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、Row_NUMBER按RowNumber分割按IDORDER按idNew从temp中选择
Order by Row\ u NUMBER按RowNumber Order by id,RowNumber

您需要一个列来指定行的顺序。哪些规则可以将您的输出确定为给定输入所需的输出?对输入的每一行设置答案的格式,我想计算New as的值……。他的示例表甚至不是一个集合。由于允许重复值,SQL表表示无序的多个集合。
PK    ID     RowNumber
----- ------ -----------
1     101    1
2     101    2
3     101    3
4     101    4
5     101    5
6     101    1
7     101    2
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