Я согласен с предположением, что данные должны быть нормализованы, но тогда у вас есть другая проблема для ответа на вопрос, одна из которых я не уверен, как вы это сделаете в SQL (так как он основан на порядок записей). То есть вам нужно пройти набор записей, чтобы сделать это. Я предполагаю, что коррелированный подзапрос мог бы добиться цели, но он должен был бы основываться на том, что можно заказать.
Мои навыки работы с SQL не невероятны, поэтому в резюме я не буду предлагать решение SQL, но, возможно, кто-то еще предложит.
Вместо этого я предложу функцию, которая могла бы вернуть ответ в исходной ненормализованной структуре данных. Я основываю это на своей существующей функции iMax (), которая выглядит следующим образом:
Public Function iMax(ParamArray p()) As Variant
' Idea from Trevor Best in Usenet MessageID
' rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
Dim i As Long
Dim lngUBound As Long
Dim v As Variant
v = p(LBound(p))
lngUBound = UBound(p)
For i = LBound(p) + 1 To lngUBound
If v < p(i) Then
v = p(i)
End If
Next
iMax = v
End Function
Идея заключается в использовании массива параметров для передачи значений в функцию, а затем в обход массива для получения необходимой информации. В этом случае вам нужно пройтись по массиву и посчитать, сколько раз он изменяется, примерно так:
Public Function CountChange(ParamArray varInput()) As Long
Dim varValue As Variant
Dim varPrevious As Variant
Dim lngCount As Long
varPrevious = varInput(0)
For Each varValue In varInput()
If varValue <> varPrevious Then
lngCount = lngCount + 1
End If
varPrevious = varValue
Next varValue
CountChange = lngCount
End Function
Я не очень тщательно проверял это, и он вообще не имеет отношения к Nulls, но в этом-то и заключается идея - это очень полезная концепция для сравнения данных из полей в одной строке.