我一直在努力寻找这个问题的答案,但运气不佳。
我有一个包含样本测量数据的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;