SQL从滚动ID生成唯一ID



我一直在努力寻找这个问题的答案,但运气不佳。

我有一个包含样本测量数据的SQL表,我需要一种方法为每个样本分配一个唯一的ID。现在,每个样本都有一个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。

我想推测一下,您希望为每个样本分配一个唯一的数字,现在您有了重复。

如果是这样,您可以使用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;

最新更新