当 Dense_Rank() 值增加时重置 Row_Number() 值
Reset Row_Number() value when Dense_Rank() value increases
我想在 Dense_Rank() 值增加时重新开始 SELECT 语句中 Row_Number() 列的编号。我尝试用游标来做,但我遇到了数据四舍五入的问题。有没有其他不使用光标的方法?
DECLARE @RowNum as INT;
DECLARE @DenseRank as INT;
DECLARE @DenseRankPrevious as INT;
DECLARE @RD_ROI1_minus_RD_ROI3 as NVARCHAR(MAX);
DECLARE @RD_ROI2_minus_RD_ROI3 as NVARCHAR(MAX);
DECLARE @Cursor as CURSOR;
SET @RowNum = 0;
SET @Cursor = CURSOR FOR
SELECT DENSE_RANK() OVER (ORDER BY [RD_RF_ID]) AS DenseRank, [RD_ROI1_minus_RD_ROI3]
FROM [dbo].[vw_Raw_Data] WHERE [dbo].[vw_Raw_Data].RD_GUID_ID = 433
CREATE TABLE #TempTable(
RowNum int,
DenseRank int,
ROI1_New NVARCHAR(MAX))
OPEN @Cursor;
FETCH NEXT FROM @Cursor INTO @DenseRank, @RD_ROI1_minus_RD_ROI3;
SET @DenseRankPrevious = @DenseRank;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @DenseRankPrevious = @DenseRank
SET @RowNum = @RowNum + 1;
ELSE
BEGIN
SET @RowNum = 0;
SET @RowNum = @RowNum + 1;
SET @DenseRankPrevious = @DenseRank;
END
INSERT INTO #TempTable
SELECT @RowNum, @DenseRank, @RD_ROI1_minus_RD_ROI3 ;
FETCH NEXT FROM @Cursor INTO @DenseRank, @RD_ROI1_minus_RD_ROI3;
END
CLOSE @Cursor;
DEALLOCATE @Cursor;
SELECT * FROM #TempTable
DROP TABLE #TempTable
以上代码给出如下结果
- 1 1 178.409
- 2 1 173.23
- 3 1 164.867
- 4 1 165.52
- 5 1 153.351
- 6 1 160.773
- 7 1 157.694
而不是预期的以下内容。
- 1 1 178,409039893888
- 2 1 173,230282624222
- 3 1 164,86654423018
- 4 1 165,52035506581
- 5 1 153,351290684624
- 6 1 160,773492500765
- 7 1 157,694316906438
知道为什么会出现这种舍入吗?提前致谢!
为什么要为此使用游标?
SELECT ROW_NUMBER() OVER (PARTITION BY DenseRank ORDER BY (SELECT NULL)) as rn,
rd.*
FROM (SELECT DENSE_RANK() OVER (ORDER BY rd.RD_RF_ID) AS DenseRank,
RD_ROI1_minus_RD_ROI3
FROM dbo.vw_Raw_Data rd
WHERE rd.RD_GUID_ID = 433
) rd;
我想在 Dense_Rank() 值增加时重新开始 SELECT 语句中 Row_Number() 列的编号。我尝试用游标来做,但我遇到了数据四舍五入的问题。有没有其他不使用光标的方法?
DECLARE @RowNum as INT;
DECLARE @DenseRank as INT;
DECLARE @DenseRankPrevious as INT;
DECLARE @RD_ROI1_minus_RD_ROI3 as NVARCHAR(MAX);
DECLARE @RD_ROI2_minus_RD_ROI3 as NVARCHAR(MAX);
DECLARE @Cursor as CURSOR;
SET @RowNum = 0;
SET @Cursor = CURSOR FOR
SELECT DENSE_RANK() OVER (ORDER BY [RD_RF_ID]) AS DenseRank, [RD_ROI1_minus_RD_ROI3]
FROM [dbo].[vw_Raw_Data] WHERE [dbo].[vw_Raw_Data].RD_GUID_ID = 433
CREATE TABLE #TempTable(
RowNum int,
DenseRank int,
ROI1_New NVARCHAR(MAX))
OPEN @Cursor;
FETCH NEXT FROM @Cursor INTO @DenseRank, @RD_ROI1_minus_RD_ROI3;
SET @DenseRankPrevious = @DenseRank;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @DenseRankPrevious = @DenseRank
SET @RowNum = @RowNum + 1;
ELSE
BEGIN
SET @RowNum = 0;
SET @RowNum = @RowNum + 1;
SET @DenseRankPrevious = @DenseRank;
END
INSERT INTO #TempTable
SELECT @RowNum, @DenseRank, @RD_ROI1_minus_RD_ROI3 ;
FETCH NEXT FROM @Cursor INTO @DenseRank, @RD_ROI1_minus_RD_ROI3;
END
CLOSE @Cursor;
DEALLOCATE @Cursor;
SELECT * FROM #TempTable
DROP TABLE #TempTable
以上代码给出如下结果
- 1 1 178.409
- 2 1 173.23
- 3 1 164.867
- 4 1 165.52
- 5 1 153.351
- 6 1 160.773
- 7 1 157.694
而不是预期的以下内容。
- 1 1 178,409039893888
- 2 1 173,230282624222
- 3 1 164,86654423018
- 4 1 165,52035506581
- 5 1 153,351290684624
- 6 1 160,773492500765
- 7 1 157,694316906438
知道为什么会出现这种舍入吗?提前致谢!
为什么要为此使用游标?
SELECT ROW_NUMBER() OVER (PARTITION BY DenseRank ORDER BY (SELECT NULL)) as rn,
rd.*
FROM (SELECT DENSE_RANK() OVER (ORDER BY rd.RD_RF_ID) AS DenseRank,
RD_ROI1_minus_RD_ROI3
FROM dbo.vw_Raw_Data rd
WHERE rd.RD_GUID_ID = 433
) rd;