SQL从滚动ID

时间:2018-10-30 15:28:02

标签: sql sql-server

在一天的大部分时间里,我一直在努力寻找答案,但没有运气。

我有一个包含样品测量数据的SQL表,我需要一种为每个样品分配唯一ID的方法。现在,每个样本都有一个ID编号,该编号会频繁滚动。我需要的是每个样本的唯一ID。下面是带有简化数据集的表格,以及可能满足我需要的UID的示例。

 | Row | Time  | Meas# | Sample# | UID (Desired) |
 | 1   | 09:00 |   1   |    1    |       1       |
 | 2   | 09:01 |   2   |    1    |       1       |
 | 3   | 09:02 |   3   |    1    |       1       |
 | 4   | 09:07 |   1   |    2    |       2       |
 | 5   | 09:08 |   2   |    2    |       2       |
 | 6   | 09:09 |   3   |    2    |       2       |
 | 7   | 09:24 |   1   |    3    |       3       |
 | 8   | 09:25 |   2   |    3    |       3       |
 | 9   | 09:25 |   3   |    3    |       3       |
 | 10  | 09:47 |   1   |    1    |       4       |
 | 11  | 09:47 |   2   |    1    |       4       |
 | 12  | 09:49 |   3   |    1    |       4       |

我的问题是,第10-12行与第1-3行具有相同的Sample#。我需要一种唯一标识和分组每个样本的方法。在样品上具有第一次测量的行号或时间会很好。

另一个复杂之处在于,测量编号并不总是以1开头。它是基于测量位置的,有时会跳过位置1,而仅包含位置2和3。

1 个答案:

答案 0 :(得分:1)

我要推测您想要为每个样本分配一个唯一的编号,现在您可以在其中重复。

如果是这样,您可以使用lag()和累计金额:

select t.*,
       sum(case when prev_sample = sample then 0 else 1 end) over (order by row) as new_sample_number
from (select t.*,
             lag(sample) over (order by row) as prev_sample
      from t
     ) t;