Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对可能有重复数字的数字列表进行排序_Sql_Sql Server_Tsql_Ranking - Fatal编程技术网

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年使用):