У меня есть огромные данные и образец таблицы выглядит, как показано нижеОбновление с помощью автообъединение Sql Server
+-----------+------------+-----------+-----------+
| Unique_ID | Date | RowNumber | Flag_Date |
+-----------+------------+-----------+-----------+
| 1 | 6/3/2014 | 1 | 6/3/2014 |
| 1 | 5/22/2015 | 2 | NULL |
| 1 | 6/3/2015 | 3 | NULL |
| 1 | 11/20/2015 | 4 | NULL |
| 2 | 2/25/2014 | 1 | 2/25/2014 |
| 2 | 7/31/2014 | 2 | NULL |
| 2 | 8/26/2014 | 3 | NULL |
+-----------+------------+-----------+-----------+
Теперь мне нужно проверить, если разница между датой во 2-й строке и Flag_date в 1-м ряду. Если разница больше 180, то вторая строка Flag_date должна быть обновлена с датой во второй строке, иначе она должна быть обновлена Flag_date в 1 строке. И это же правило следует для всех строк с одинаковым unique_id
update a
set a.Flag_Date=case when DATEDIFF(dd,b.Flag_Date,a.[Date])>180 then a.[Date] else b.Flag_Date end
from Table1 a
inner join Table1 b
on a.RowNumber=b.RowNumber+1 and a.Unique_ID=b.Unique_ID
Приведенный выше запрос обновления, когда выполняется один раз, только вторая строка под каждым unique_id обновляется и результат выглядит, как показано ниже
+-----------+------------+-----------+------------+
| Unique_ID | Date | RowNumber | Flag_Date |
+-----------+------------+-----------+------------+
| 1 | 2014-06-03 | 1 | 2014-06-03 |
| 1 | 2015-05-22 | 2 | 2015-05-22 |
| 1 | 2015-06-03 | 3 | NULL |
| 1 | 2015-11-20 | 4 | NULL |
| 2 | 2014-02-25 | 1 | 2014-02-25 |
| 2 | 2014-07-31 | 2 | 2014-02-25 |
| 2 | 2014-08-26 | 3 | NULL |
+-----------+------------+-----------+------------+
И мне нужно бежать четыре раза, чтобы достичь нужного мне результата
+-----------+------------+-----------+------------+
| Unique_ID | Date | RowNumber | Flag_Date |
+-----------+------------+-----------+------------+
| 1 | 2014-06-03 | 1 | 2014-06-03 |
| 1 | 2015-05-22 | 2 | 2015-05-22 |
| 1 | 2015-06-03 | 3 | 2015-05-22 |
| 1 | 2015-11-20 | 4 | 2015-11-20 |
| 2 | 2014-02-25 | 1 | 2014-02-25 |
| 2 | 2014-07-31 | 2 | 2014-02-25 |
| 2 | 2014-08-26 | 3 | 2014-08-26 |
+-----------+------------+-----------+------------+
есть ли способ, где я могу запустить обновление только один раз, и все строки обновляются.
Спасибо!
Спасибо, Гордон. Am on 2008R2 и, следовательно, lag() не работают для меня. есть способ, которым я могу заставить этот запрос работать в 2008 году? Пожалуйста, дайте мне знать – Santosh
Спасибо, Гордон. Это прекрасно работает – Santosh