Sql 对可能有重复数字的数字列表进行排序
我正在寻找一种方法,在一个可能包含重复项的列表中,对数字序列中的第一个变化进行排序。。。例如Sql 对可能有重复数字的数字列表进行排序,sql,sql-server,tsql,ranking,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 我找到了一种在E
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
,因此没有可用的排名或分区
谢谢如果你假设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
我使用了一个临时表作为一种添加秩值的廉价方法。还有其他方法可以做到这一点,但在01:05,这是最好的你会得到
我在这里做了一个SQL提琴(2008年,但没有任何2008年的功能,所以应该可以在2000年使用):