对可能包含重复数字的数字列表进行排名

时间:2014-04-08 22:43:20

标签: sql sql-server tsql ranking

我正在寻找一种方法来对列表中可能包含重复项的数字序列中的第一个更改进行排名...示例...

rec#  number
1     328
2     32C
3     32C
4     328
5     328

我正在寻找的是找到第一个328为#1 ...然后第一个32C为#2 ...然后下一个出现328为#3 ...依此类推...最终结果看起来像这样

rec#  Number  rank
1     328     1
2     32C     2
4     328     3

我找到了一种方法在Excel中执行它然后将它带回SQL ...并且想知道SQL中是否有类似的东西...我正在使用SQL2000所以没有排名或分区可用...

由于

1 个答案:

答案 0 :(得分:0)

如果您假设rec#是连续且不间断的,那么您可以执行以下操作。让我解释一下:

SELECT t1.[rec#] AS rec1,
t2.[rec#] AS rec2,
t1.Number AS Num1,
t2.Number AS Num2,
CASE WHEN t2.Number IS NULL THEN 1
     WHEN t1.Number = t2.Number THEN 1
     ELSE 0
END AS MATCH
FROM Test t1
LEFT JOIN Test t2 ON t1.[rec#] = t2.[rec#] + 1

带有+1的左连接是关键位,允许您将表连接回自身但移动了一行。然后我们可以将每一行与前一行进行比较,看看它是否匹配。

给你:

t1.rec#  t1.number  t2.rec#  t2.number  Match
1        328        Null     Null       1
2        32C        1        328        0
3        32C        2        32C        1
4        328        3        32C        0
5        328        4        328        1

所以...

然后你可以说

SELECT 
   CASE
      WHEN x.rec2 IS NULL THEN x.rec1
      ELSE x.rec2
   END AS [rec#],
   x.Num1 AS Number,
IDENTITY(INT, 1,1) AS Rank
INTO #Ranks

FROM (
    SELECT t1.[rec#] AS rec1,
    t2.[rec#] AS rec2,
    t1.Number AS Num1,
    t2.Number AS Num2,
    CASE WHEN t2.Number IS NULL THEN 1
         WHEN t1.Number = t2.Number THEN 1
         ELSE 0
    END AS MATCH
    FROM Test t1
    LEFT JOIN Test t2 ON t1.[rec#] = t2.[rec#] + 1
) x
WHERE x.MATCH = 1

SELECT * FROM #Ranks

我使用临时表作为添加Rank值的便宜方式。还有其他方法可以做到这一点,但在01:05,这是你将获得的最佳方式。

我已经完成了一个SQL小提琴(2008年,但没有任何2008年的功能,所以应该在2000年工作):Enjoy