在 SQL 的动态查询中排名

Rank in dynamic query in SQL

我正在尝试构建动态查询并基于其中一列创建排名 这是我目前的代码

/*Declare Variable*/
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX), 
        @PivotColumnNames AS NVARCHAR(MAX),
        @PivotSelectColumnNames AS NVARCHAR(MAX),
        @Week_Value AS NVARCHAR(MAX),
        @Rank AS NVARCHAR(MAX)


--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames= ISNULL(@PivotColumnNames + ',','')+ QUOTENAME([W])
    FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
        ORDER BY [W]

--Get distinct values of the PIVOT Column with isnull
SELECT @PivotSelectColumnNames = ISNULL(@PivotSelectColumnNames + ',','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
    FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
        ORDER BY [W]

--Get current week value
SET @Week_Value = SUBSTRING(@PivotColumnNames,81,15)
--PRINT @Week_Value --Make sure value is correct 

--Get the ranking for previews week
SET @Rank = 0 -- this initialize the rank

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = '
SELECT TOP 200 [L], [Doc_ID], '+@PivotSelectColumnNames+','+@Rank+' AS RNK
   FROM   
    (SELECT [L], 
            [Doc_ID],
            [W],
            ISNULL(CAST([PV] AS INT),0) AS [Page_Views] 
        FROM [Server].[dbo].[Table]
            WHERE LEN([Doc_ID]) = 8 OR LEN([Doc_ID]) = 9)Tab1  
PIVOT  
(  
SUM([Page_Views])
FOR [Week] IN ('+@PivotColumnNames+')
) AS Tab2
ORDER BY '+@Week_Value+' DESC'

--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

所以问题是排名是静态的,我不知道如何在每一行中求和 +1,排名必须根据 @PivotColumnNames 顺序设置,这是我的数据样本到目前为止应用上面的代码

L Doc_ID Week 12, 2021 Week 13, 2021 Week 14, 2021 Week 15, 2021 RNK
en c03722645m 191867 168145 188472 185189 0
fr c03746609 55908 53467 56678 56028 0

这就是我想要的

L Doc_ID Week 12, 2021 Week 13, 2021 Week 14, 2021 Week 15, 2021 RNK
en c03722645m 191867 168145 188472 185189 1
fr c03746609 55908 53467 56678 56028 2

如有任何帮助或建议,我们将不胜感激

您好 TSQL 中有多个 Ranking 选项可用。您遇到的问题必须根据您的要求确定所需的排名功能。我将在这个眼周解决方案中使用 RANK() 函数

/*Declare Variable*/
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX), 
        @PivotColumnNames AS NVARCHAR(MAX),
        @PivotSelectColumnNames AS NVARCHAR(MAX),
        @RankingSelectColumn AS VARCHAR(MAX), --Create ranking statement (Added)
        @Week_Value AS NVARCHAR(MAX),
        @Rank AS NVARCHAR(MAX)


--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames= ISNULL(@PivotColumnNames + ',','')+ QUOTENAME([W])
    FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
        ORDER BY [W]

   --Make Ranking logic depending on the rank change ASC or DESC
    SELECT @RankingSelectColumn = ISNULL(@RankingSelectColumn + ' ASC,','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
    FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
        ORDER BY [W]


--Get distinct values of the PIVOT Column with isnull (Added)
SELECT @PivotSelectColumnNames = ISNULL(@PivotSelectColumnNames + ',','')+ 'ISNULL(' + QUOTENAME([W]) + ', 0) AS '+ QUOTENAME([W])
    FROM (SELECT DISTINCT [W] FROM [Server].[dbo].[Table]) AS cat
        ORDER BY [W]

--Get current week value
SET @Week_Value = SUBSTRING(@PivotColumnNames,81,15)
--PRINT @Week_Value --Make sure value is correct 

--Get the ranking for previews week
SET @Rank = 0 -- this initialize the rank

--Prepare the PIVOT query using the dynamic (Added Rank function)
SET @DynamicPivotQuery = '
SELECT TOP 200 [L], [Doc_ID], '+@PivotSelectColumnNames+',RANK() OVER('+@RankingSelectColumn+') AS RNK
   FROM   
    (SELECT [L], 
            [Doc_ID],
            [W],
            ISNULL(CAST([PV] AS INT),0) AS [Page_Views] 
        FROM [Server].[dbo].[Table]
            WHERE LEN([Doc_ID]) = 8 OR LEN([Doc_ID]) = 9)Tab1  
PIVOT  
(  
SUM([Page_Views])
FOR [Week] IN ('+@PivotColumnNames+')
) AS Tab2
ORDER BY '+@Week_Value+' DESC'

--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

这将根据列逻辑排名