在SQL中编号行

时间:2016-12-20 07:39:56

标签: sql sql-server tsql

我对SQL中的编号行有问题。我有一张桌子:

loeid   loe_logid  loe_gidn  lp     ZGNumerloe
----------------------------------------------
76284   5136       198570     1          9820
76285   5136       198571     2          9820
76286   5136       198572     3          9820
76287   5136       198573     4          9820
76288   5136       198574     5          2804
76289   5136       198575     6          2804
76290   5136       198576     7          9294

我需要编号为ZGNumerloe列的行。

loeid   loe_logid  loe_gidn  lp     ZGNumerloe  rank
----------------------------------------------------
76284   5136       198570     1          9820    1
76285   5136       198571     2          9820    1
76286   5136       198572     3          9820    1
76287   5136       198573     4          9820    1
76288   5136       198574     5          2804    2
76289   5136       198575     6          2804    2
76290   5136       198576     7          9294    3

我使用了函数DENSE_RANK但不必要地对我的报告进行排序。

4 个答案:

答案 0 :(得分:3)

完整的工作示例:

DECLARE @DataSource TABLE
(
     [loeid] INT
    ,[loe_logid] INT
    ,[loe_gidn] INT
    ,[lp] TINYINT
    ,[ZGNumerloe] INT
);

INSERT INTO @DataSource ([loeid], [loe_logid], [loe_gidn], [lp], [ZGNumerloe])
VALUES (76284, 5136, 198570, 1, 98201)
      ,(76285, 5136, 198571, 2, 98201)
      ,(76286, 5136, 198572, 3, 98201)
      ,(76287, 5136, 198573, 4, 98201)
      ,(76288, 5136, 198574, 5, 28042)
      ,(76289, 5136, 198575, 6, 28042)
      ,(76290, 5136, 198576, 7, 92943);

WITH DataSource ([loeid], [loe_logid], [loe_gidn], [lp], [ZGNumerloe], [MinLPForZG]) AS
(
    SELECT *
          ,MIN([LP]) OVER (PARTITION BY [ZGNumerloe])
    FROM @DataSource
)
SELECT [loeid]
      ,[loe_logid]
      ,[loe_gidn]
      ,[lp]
      ,[ZGNumerloe]
      ,DENSE_RANK() OVER (ORDER BY [MinLPForZG])
FROM DataSource;

enter image description here

答案 1 :(得分:0)

这句话但不必要地对我的报告进行排序让我想到,你可能不知道一些排序原则。

  • 结果集中有无隐式排序顺序
  • 只有一种方法可以保证排序顺序:最外面的ORDER BY
  • SELECT
  • 如果您的报告按照您需要的方式进行排序,并且在使用DENSE_RANK之后,它已不再是您很幸运
  • 使用OVER(ORDER BY...)
  • 对结果集进行排序是函数的预期行为
  • 查看示例中的documentation

你找到那里

  

请注意,OVER子句中的ORDER BY命令DENSE_RANK,SELECT语句的ORDER BY命令结果集。

更新

这句话我需要编号ZGNumerloe 列的行数让我觉得,你最终都在寻找这个

ROW_NUMBER() OVER(PARTITION BY ZGNumerloe ORDER BY lp) AS PartitionedNumber

答案 2 :(得分:-1)

select *, row_number () over (partition by loeid,loe_gidn order by lp asc) as rnk from Yourtable

答案 3 :(得分:-1)

非常简单,需要使用dense_rank函数。

SELECT *,DENSE_RANK() OVER(ORDER  BY [ZGNUMERLOE] DESC) Rnk FROM #TABLE1