t-sql为连续分区或运行编号(字段中相同值的序列)

nik*_*kov 2 sql t-sql database sql-server

这似乎是一个非常简单的问题,但我无法弄清楚单向(单眼)SQL查询将采用以下内容并添加一个字段location number,该字段在第一次运行时将为1,对于第一次运行DAL将为2 BOS运行,并在下一次运行中运行3 DAL。我知道如何标记第一个分区(使用两个ROW_NUMBER())。

+---------+--------+-----------+----------+
| ITEM_ID | LOT_ID | ORGN_CODE | TRANS_ID |
+---------+--------+-----------+----------+
|      61 |  15161 | DAL       |   992342 |
|      61 |  15161 | DAL       |   992347 |
|      61 |  15161 | DAL       |  1043941 |
|      61 |  15161 | BOS       |  1061565 |
|      61 |  15161 | BOS       |  1064997 |
|      61 |  15161 | BOS       |  1064998 |
|      61 |  15161 | BOS       |  1064999 |
|      61 |  15161 | BOS       |  1065000 |
|      61 |  15161 | BOS       |  1065036 |
|      61 |  15161 | BOS       |  1065062 |
|      61 |  15161 | BOS       |  1065063 |
|      61 |  15161 | DAL       |  1065184 |
|      61 |  15161 | DAL       |  1065185 |
|      61 |  15161 | DAL       |  1065186 |
|      61 |  15161 | DAL       |  1065197 |
|      61 |  15161 | DAL       |  1065198 |
|      61 |  15161 | DAL       |  1083864 |
|      61 |  15161 | DAL       |  1083865 |
+---------+--------+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

RBa*_*ung 5

像这样尝试:

SELECT  *
    ,   DENSE_RANK() OVER(Order By GroupOrder) As GroupSequence
FROM (
    SELECT *,
        ROW_NUMBER() OVER(Order By TRANS_ID)
        -   ROW_NUMBER() OVER(Partition By ORGN_CODE Order By TRANS_ID)
            As GroupOrder
    FROM    yourTable
    )       As grp
Run Code Online (Sandbox Code Playgroud)

仅一次通过,没有光标。在SQL Server(tsql)上,这符合对源表的单次扫描。