Допустим, у меня есть следующая таблица в SQL Server 2005:
id | Date | Letter
-----------------------------
01 | 5/1/2009 | W
02 | 5/1/2009 | X
03 | 5/1/2009 | Y
04 | 5/1/2009 | Z
05 | 5/1/2009 | A
06 | 5/1/2009 | B
07 | 5/1/2009 | D
08 | 5/1/2009 | E
09 | 5/2/2009 | W
10 | 5/2/2009 | X
11 | 5/2/2009 | Y
12 | 5/2/2009 | Z
13 | 5/2/2009 | A
14 | 5/2/2009 | B
15 | 5/2/2009 | C
16 | 5/2/2009 | D
17 | 5/3/2009 | W
18 | 5/3/2009 | X
В моем предыдущем вопросе я спросил, как определить, какая последовательность букв отсутствовала. В моем примере это будет буква C между строками 6 и 7. Я получил следующий ответ, и он работает по большей части:
SELECT * from TABLE1 t1
LEFT OUTER JOIN TABLE2 t2
ON ASCII(t2.INTCol) - 1 = ASCII(t2.INTCol)
AND t1.date = t2.date
WHERE t2.id IS NULL
Однако у этого решения есть две проблемы. Он вернет ложные срабатывания в двух случаях.
Последовательность букв начинается каждый день с буквы «W». Итак, я получаю ложноположительный результат для последней записи каждого дня. Это были бы строки 8 и 16 в моих данных примера.
Поскольку последовательность начинается каждый день с 'W', я получаю ложное срабатывание для записи 'Z', потому что ('Z' + 1) дает мне '[', а не 'A'.
Для # 2, я полагаю, я могу вставить утверждение «IF», которое говорит: «Если это Z, ищите A», но я открыт для любых «более чистых» решений.
Я действительно понятия не имею, как сделать # 1, поэтому я действительно ищу помощь по этому вопросу.
EDIT: Что-то, что я пропустил, выполнение MAX (t1.id) не сработает, поскольку строки не всегда вставляются в последовательности. На самом деле, глядя на мои данные, они всегда вставляются в порядке [a-z], хотя первая запись - «w». Я знаю, что это неубедительно, но я имею дело с файлами журналов от телефонных коммутаторов за десятки миллионов долларов. Я мало что могу с этим поделать.