我正在寻找一种方法来对列表中可能包含重复项的数字序列中的第一个更改进行排名...示例...
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
所以没有排名或分区可用...
由于
答案 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