Sql server T-SQL创建一个ID列

Sql server T-SQL创建一个ID列,sql-server,sql-server-2008,rank,row-number,contiguous,Sql Server,Sql Server 2008,Rank,Row Number,Contiguous,我使用的是SQL Server 2008 R2,我有以下数据集: +---------+--------------+--------------+----------+------------+------------+ | Dossier | refmouvement | refadmission | refunite | datedeb | datefin | +---------+--------------+--------------+----------+-------

我使用的是SQL Server 2008 R2,我有以下数据集:

+---------+--------------+--------------+----------+------------+------------+
| Dossier | refmouvement | refadmission | refunite |  datedeb   |  datefin   |
+---------+--------------+--------------+----------+------------+------------+
| P001234 |         2567 |         1234 |      227 | 2012-01-01 | 2012-01-02 |
| P001234 |         2568 |         1234 |      227 | 2012-01-02 | 2012-01-03 |
| P001234 |         2569 |         1234 |      224 | 2012-01-03 | 2012-01-06 |
| P001234 |         2570 |         1234 |      232 | 2012-01-06 | 2012-01-10 |
| P001234 |         2571 |         1234 |      232 | 2012-01-10 | 2012-01-15 |
| P001234 |         2572 |         1234 |      232 | 2012-01-15 | 2012-01-20 |
| P001234 |         2573 |         1234 |      232 | 2012-01-20 | 2012-01-25 |
| P001234 |         2574 |         1234 |      224 | 2012-01-25 | 2012-01-29 |
| P001234 |         2575 |         1234 |      227 | 2012-01-29 | 2012-02-05 |
| P001234 |         2576 |         1234 |      227 | 2012-02-05 | 2012-02-10 |
| P001234 |         2577 |         1234 |      232 | 2012-02-10 | 2012-02-15 |
| P001234 |         2578 |         1234 |      201 | 2012-02-15 | 2012-02-26 |
+---------+--------------+--------------+----------+------------+------------+
此数据集按
datedeb
排序,也称为
startdate

您可以注意到,这是一个连续的数据集,
datefin
等于下一行的
datedeb

我需要创建一个
ID
列,该列将根据
refundite
datedeb
列提供唯一的ID,如下所示:

+----+---------+--------------+--------------+----------+------------+------------+
| ID | Dossier | refmouvement | refadmission | refunite |  datedeb   |  datefin   |
+----+---------+--------------+--------------+----------+------------+------------+
|  1 | P001234 |         2567 |         1234 |      227 | 2012-01-01 | 2012-01-02 |
|  1 | P001234 |         2568 |         1234 |      227 | 2012-01-02 | 2012-01-03 |
|  2 | P001234 |         2569 |         1234 |      224 | 2012-01-03 | 2012-01-06 |
|  3 | P001234 |         2570 |         1234 |      232 | 2012-01-06 | 2012-01-10 |
|  3 | P001234 |         2571 |         1234 |      232 | 2012-01-10 | 2012-01-15 |
|  3 | P001234 |         2572 |         1234 |      232 | 2012-01-15 | 2012-01-20 |
|  3 | P001234 |         2573 |         1234 |      232 | 2012-01-20 | 2012-01-25 |
|  4 | P001234 |         2574 |         1234 |      224 | 2012-01-25 | 2012-01-29 |
|  5 | P001234 |         2575 |         1234 |      227 | 2012-01-29 | 2012-02-05 |
|  5 | P001234 |         2576 |         1234 |      227 | 2012-02-05 | 2012-02-10 |
|  6 | P001234 |         2577 |         1234 |      232 | 2012-02-10 | 2012-02-15 |
|  7 | P001234 |         2578 |         1234 |      201 | 2012-02-15 | 2012-02-26 |
+----+---------+--------------+--------------+----------+------------+------------+
WITH CTEHelper AS 
    (SELECT ROW_NUMBER() OVER(ORDER BY datedeb) AS RowNum,
            refunite, 
            datedeb
    FROM    dbo.Sometable),
CTERecursive AS (
        SELECT  crt.RowNum,
                crt.refunite,
                crt.datedeb,
                1 AS Id -- Starting rank
        FROM    CTEHelper crt
        WHERE   crt.RowNum = 1
        UNION ALL
        SELECT  crt.RowNum,
                crt.refunite,
                crt.datedeb,
                CASE WHEN prev.refunite = crt.refunite THEN prev.Id ELSE prev.Id + 1 END
        FROM    CTEHelper crt INNER JOIN CTERecursive prev ON crt.RowNum = prev.RowNum + 1
    )
SELECT  crt.id, 
        s.*
FROM    CTERecursive crt
    JOIN Sometable s ON s.refunite = crt.refunite AND s.datedeb = crt.datedeb
我就是不能用
RANK()
ROW\u NUMBER()
densite\u RANK()
函数或两者的组合来实现这一点,我到处都找过了,但什么也找不到,也许我没有使用正确的关键字,但我就是想不出来

任何帮助都将不胜感激

谢谢

以下是我迄今为止尝试过的代码:

SELECT 
   ROW_NUMBER() over(order by t1.[datedeb])  as [ID1],
   dense_Rank() over(partition by t1.[refunite]   order by t1.[datedeb])  as [ID2],
   t1.[Dossier]
   ,t1.[refmouvement]
   ,t1.[refadmission]
   ,t1.[refunite]
   ,t1.[datedeb]
   ,t1.[datefin]
   ,t2.[refmouvement] as [prev_refmouvement]
   ,t2.refunite as prev_refunite
FROM [sometable] t1
LEFT OUTER JOIN [sometable] t2  /*self join*/
     ON t2.datefin = t1.datedeb
        AND t1.[refadmission] = t2.[refadmission]
ORDER BY
   t1.[datedeb]
这就是它给我的:

+-----+-----+---------+--------------+--------------+----------+------------+------------+-------------------+---------------+
| ID1 | ID2 | Dossier | refmouvement | refadmission | refunite |  datedeb   |  datefin   | prev_refmouvement | prev_refunite |
+-----+-----+---------+--------------+--------------+----------+------------+------------+-------------------+---------------+
|   1 |   1 | P001234 |         2567 |         1234 |      227 | 2012-01-01 | 2012-01-02 | NULL              | NULL          |
|   2 |   2 | P001234 |         2568 |         1234 |      227 | 2012-01-02 | 2012-01-03 | 2567              | 227           |
|   3 |   1 | P001234 |         2569 |         1234 |      224 | 2012-01-03 | 2012-01-06 | 2568              | 227           |
|   4 |   1 | P001234 |         2570 |         1234 |      232 | 2012-01-06 | 2012-01-10 | 2569              | 224           |
|   5 |   2 | P001234 |         2571 |         1234 |      232 | 2012-01-10 | 2012-01-15 | 2570              | 232           |
|   6 |   3 | P001234 |         2572 |         1234 |      232 | 2012-01-15 | 2012-01-20 | 2571              | 232           |
|   7 |   4 | P001234 |         2573 |         1234 |      232 | 2012-01-20 | 2012-01-25 | 2572              | 232           |
|   8 |   2 | P001234 |         2574 |         1234 |      224 | 2012-01-25 | 2012-01-29 | 2573              | 232           |
|   9 |   3 | P001234 |         2575 |         1234 |      227 | 2012-01-29 | 2012-02-05 | 2574              | 224           |
|  10 |   4 | P001234 |         2576 |         1234 |      227 | 2012-02-05 | 2012-02-10 | 2575              | 227           |
|  11 |   5 | P001234 |         2577 |         1234 |      232 | 2012-02-10 | 2012-02-15 | 2576              | 227           |
|  12 |   1 | P001234 |         2578 |         1234 |      201 | 2012-02-15 | 2012-02-26 | 2577              | 232           |
+-----+-----+---------+--------------+--------------+----------+------------+------------+-------------------+---------------+
沙兹

结果:

RowNum      refunite    datedeb                 Rnk
----------- ----------- ----------------------- ---
1           227         2012-01-01 00:00:00.000 1
2           227         2012-01-02 00:00:00.000 1
3           224         2012-01-03 00:00:00.000 2
4           232         2012-01-06 00:00:00.000 3
5           232         2012-01-10 00:00:00.000 3
6           232         2012-01-15 00:00:00.000 3
7           232         2012-01-20 00:00:00.000 3
8           224         2012-01-25 00:00:00.000 4
9           227         2012-01-29 00:00:00.000 5
10          227         2012-02-05 00:00:00.000 5
11          232         2012-02-10 00:00:00.000 6
12          201         2012-02-15 00:00:00.000 7

当然,您可以在WITH中有多个表,从而消除表变量。 根据Bogdan Sahlean的回答,您可以这样重写:

+----+---------+--------------+--------------+----------+------------+------------+
| ID | Dossier | refmouvement | refadmission | refunite |  datedeb   |  datefin   |
+----+---------+--------------+--------------+----------+------------+------------+
|  1 | P001234 |         2567 |         1234 |      227 | 2012-01-01 | 2012-01-02 |
|  1 | P001234 |         2568 |         1234 |      227 | 2012-01-02 | 2012-01-03 |
|  2 | P001234 |         2569 |         1234 |      224 | 2012-01-03 | 2012-01-06 |
|  3 | P001234 |         2570 |         1234 |      232 | 2012-01-06 | 2012-01-10 |
|  3 | P001234 |         2571 |         1234 |      232 | 2012-01-10 | 2012-01-15 |
|  3 | P001234 |         2572 |         1234 |      232 | 2012-01-15 | 2012-01-20 |
|  3 | P001234 |         2573 |         1234 |      232 | 2012-01-20 | 2012-01-25 |
|  4 | P001234 |         2574 |         1234 |      224 | 2012-01-25 | 2012-01-29 |
|  5 | P001234 |         2575 |         1234 |      227 | 2012-01-29 | 2012-02-05 |
|  5 | P001234 |         2576 |         1234 |      227 | 2012-02-05 | 2012-02-10 |
|  6 | P001234 |         2577 |         1234 |      232 | 2012-02-10 | 2012-02-15 |
|  7 | P001234 |         2578 |         1234 |      201 | 2012-02-15 | 2012-02-26 |
+----+---------+--------------+--------------+----------+------------+------------+
WITH CTEHelper AS 
    (SELECT ROW_NUMBER() OVER(ORDER BY datedeb) AS RowNum,
            refunite, 
            datedeb
    FROM    dbo.Sometable),
CTERecursive AS (
        SELECT  crt.RowNum,
                crt.refunite,
                crt.datedeb,
                1 AS Id -- Starting rank
        FROM    CTEHelper crt
        WHERE   crt.RowNum = 1
        UNION ALL
        SELECT  crt.RowNum,
                crt.refunite,
                crt.datedeb,
                CASE WHEN prev.refunite = crt.refunite THEN prev.Id ELSE prev.Id + 1 END
        FROM    CTEHelper crt INNER JOIN CTERecursive prev ON crt.RowNum = prev.RowNum + 1
    )
SELECT  crt.id, 
        s.*
FROM    CTERecursive crt
    JOIN Sometable s ON s.refunite = crt.refunite AND s.datedeb = crt.datedeb

哇!这太棒了!非常感谢你!这将帮助我节省很多时间!你们真是精英啊!:)