Обновить 1 столбец на основе изменения значений в другом столбце

У меня есть таблица с примерами данных ниже:

ID    | RecordID  | Time     | Start/End
1       1111       09:00:10          
5       1111       09:00:12    
13      1111       09:01:10   
24      1111       09:02:30          
27      9999       10:00:10          
29      9999       10:01:22   
30      9999       10:03:10          
38      7777       10:20:10          
59      7777       10:21:10   
60      7777       10:24:10          
71      1111       14:20:10          
72      1111       14:21:10   
75      1111       14:24:10          

Как мне запросить таблицу, чтобы добавить 1 в столбец Start/End, когда RecordID является первым и последним экземпляром?

ID    | RecordID  | Time     | Start/End
1       1111       09:00:10          1
5       1111       09:00:12    
13      1111       09:01:10   
24      1111       09:02:30          1
27      9999       10:00:10          1
29      9999       10:01:22   
30      9999       10:03:10          1
38      7777       10:20:10          1
59      7777       10:21:10   
60      7777       10:24:10          1
71      1111       14:20:10          1
72      1111       14:21:10   
75     1111       14:24:10          1

Нужно ли перебирать таблицу?

Обратите внимание, что RecordID может быть в таблице более одного раза в течение дня.

EDIT -----------------------------

Извиняюсь, изначально я заявил, что идентификатор будет инкрементным, но это не так — приведенная выше таблица выглядит так, как если бы я вытащил данные для 1 пользователя.


person user3219693    schedule 09.05.2014    source источник


Ответы (3)


Запрос:

SQLFIDDLEEXample

UPDATE t
SET [Start/End] = CASE WHEN t1.ID is null or t2.ID is null
     THEN 1
     WHEN t.RecordID <> t1.RecordID OR t.RecordID <> t2.RecordID
     THEN 1 END 
FROM Table1 t
LEFT JOIN Table1 t1
  ON t1.ID = t.ID - 1
LEFT JOIN Table1 t2
  ON t2.ID = t.ID + 1

Результат:

| ID | RECORDID |     TIME | START/END |
|----|----------|----------|-----------|
|  1 |     1111 | 09:00:10 |         1 |
|  2 |     1111 | 09:00:12 |    (null) |
|  3 |     1111 | 09:01:10 |    (null) |
|  4 |     1111 | 09:02:30 |         1 |
|  5 |     9999 | 10:00:10 |         1 |
|  6 |     9999 | 10:01:22 |    (null) |
|  7 |     9999 | 10:03:10 |         1 |
|  8 |     7777 | 10:20:10 |         1 |
|  9 |     7777 | 10:21:10 |    (null) |
| 10 |     7777 | 10:24:10 |         1 |
| 11 |     1111 | 14:20:10 |         1 |
| 12 |     1111 | 14:21:10 |    (null) |
| 13 |     1111 | 14:24:10 |         1 |

ИЗМЕНИТЬ

Новый запрос: SQLFIDDLEExample

;WITH CTE AS (
SELECT *,
ROW_NUMBER()OVER(ORDER BY ID) rnka
FROM Table1)


UPDATE t
SET [Start/End] = CASE WHEN t1.ID is null or t2.ID is null
     THEN 1
     WHEN t.RecordID <> t1.RecordID OR t.RecordID <> t2.RecordID
     THEN 1 END 
FROM CTE t
LEFT JOIN CTE t1
  ON t1.rnka = t.rnka - 1
LEFT JOIN CTE t2
  ON t2.rnka = t.rnka + 1

Результат:

| ID | RECORDID |     TIME | START/END |
|----|----------|----------|-----------|
|  1 |     1111 | 09:00:10 |         1 |
|  5 |     1111 | 09:00:12 |    (null) |
| 13 |     1111 | 09:01:10 |    (null) |
| 24 |     1111 | 09:02:30 |         1 |
| 27 |     9999 | 10:00:10 |         1 |
| 29 |     9999 | 10:01:22 |    (null) |
| 30 |     9999 | 10:03:10 |         1 |
| 38 |     7777 | 10:20:10 |         1 |
| 59 |     7777 | 10:21:10 |    (null) |
| 60 |     7777 | 10:24:10 |         1 |
| 71 |     1111 | 14:20:10 |         1 |
| 72 |     1111 | 14:21:10 |    (null) |
| 75 |     1111 | 14:24:10 |         1 |
person Justin    schedule 09.05.2014
comment
Это работает, если данные указаны выше, но я неправильно указал данные таблицы - я изменил вопрос, чтобы устранить эту ошибку. - person user3219693; 09.05.2014
comment
Скрипка Sql всегда помогает +1 - person Nagaraj S; 09.05.2014
comment
@Justin - Вот почему вы никогда не должны полагаться на идентификаторы автоинкремента для чего-либо, кроме соединений (или разрешения конфликтов в ORDER BYs) - потому что не только будут пробелы, но иногда порядок идентификаторов не будет совпадать эквивалент столбца временной метки insertedAt либо... - person Clockwork-Muse; 09.05.2014

Отредактирован мой ответ:

Что ж, вы можете использовать следующие запросы на обновление:

UPDATE t SET t.Start/End = 1 FROM table t INNER JOIN (SELECT MIN(Id) IdMin,MIN(Time) FROM table GROUP BY RecordId) t1 ON t.Id = t1.IdMin

UPDATE t SET t.Start/End = 1 FROM table t INNER JOIN (SELECT NAX(Id) IdMax,MAX(Time) FROM table WHERE Start/End IS NULL GROUP BY RecordId ) t1 ON t.Id = t1.IdMax

person Umesh    schedule 09.05.2014
comment
Это не будет учитывать несколько RecordID, не так ли? поэтому в приведенных выше данных, если я запустил первый запрос, он поместил бы 1 для RecordID 1111 только один раз в идентификатор 1 и проигнорировал бы идентификатор 11. - person user3219693; 09.05.2014
comment
Отредактировал мой ответ. В случае первого запроса будет обновлена ​​запись, где ID=1. Второй запрос обновит запись, где ID = Max означает 13. Это правильно? Просто вопрос - почему start/end=1, где Id = 11? Это все еще в тот же день? - person Umesh; 09.05.2014
comment
Мне нужно добавить 1 для идентификатора 1 и идентификатора 11, поскольку они представляют собой 2 разных экземпляра в таблице. и 1 для ID11, хотя это тот же день, это другой экземпляр записи. Так что они не работали над 3 пластинками, они работали над 4. - person user3219693; 09.05.2014
comment
а как же 12 и 13? - person Umesh; 09.05.2014
comment
Результаты должны быть такими, как в вопросе - 2-я таблица. - person user3219693; 09.05.2014
comment
Но в этом должна быть какая-то логика? По каким критериям выбирать ID 1, 11 и 13? - person Umesh; 09.05.2014
comment
это будет 1,4 и 11,13 для RecordID 1111. Если вы упорядочиваете таблицу по идентификатору, тогда будет 1 для первого идентификатора записи и последнего идентификатора записи перед изменением идентификатора записи. - person user3219693; 09.05.2014

person    schedule
comment
Это добавляет 1 почти ко всему - person user3219693; 09.05.2014