Sql 根据更改另一列中的值更新1列

Sql 根据更改另一列中的值更新1列,sql,sql-server-2008,tsql,reportbuilder3.0,Sql,Sql Server 2008,Tsql,Reportbuilder3.0,我有一个表,其中包含以下示例数据: 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

我有一个表,其中包含以下示例数据:

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          
当RecordID是第一个也是最后一个实例时,如何查询表以向Start/End列添加1

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 -----------------------------
Apologies,我最初声明ID将是增量的,但事实并非如此-上表是如果我提取1个用户的数据时的样子。

编辑了我的答案:

您可以使用以下更新查询:

从表t中更新t SET t.Start/End=1内部联接选择MINId IdMin,通过t.Id=t1.IdMin上的RecordId t1从表组中更新MINTime

从表t中更新t SET t.Start/End=1内部联接从表中选择NAXId IdMax,MAXTime,其中Start/End为NULL,按t.Id=t1.IdMax上的记录Id t1分组编辑我的答案:

您可以使用以下更新查询:

从表t中更新t SET t.Start/End=1内部联接选择MINId IdMin,通过t.Id=t1.IdMin上的RecordId t1从表组中更新MINTime

从表t中更新t SET t.Start/End=1内部联接从表中选择NAXId IdMax,MAXTime,其中Start/End为NULL根据t.Id=t1.IdMax上的记录Id t1分组查询:

编辑

新查询:

查询:

编辑

新查询:



这不会考虑多个RecordID,是吗?因此,在上面的数据中,如果我运行第一个查询,它只会在ID 1处为RecordID 1111放置一次1,并且会忽略ID 11编辑我的答案。在第一次查询的情况下,它将更新ID=1的记录。第二个查询将更新记录,其中ID=Max表示13。对吗?只是一个问题-为什么开始/结束=1,其中Id=11?它仍然在同一天内?我需要它为ID 1和ID 11添加一个1,因为它们在表中是两个不同的实例。ID11的1,即使是同一天,也是记录的不同实例。所以他们没有在3条记录上工作,他们在4条记录上工作。那么12条和13条记录呢?结果需要如问题2表所示。这不会考虑多个记录ID,是吗?因此,在上面的数据中,如果我运行第一个查询,它只会在ID 1处为RecordID 1111放置一次1,并且会忽略ID 11编辑我的答案。在第一次查询的情况下,它将更新ID=1的记录。第二个查询将更新记录,其中ID=Max表示13。对吗?只是一个问题-为什么开始/结束=1,其中Id=11?它仍然在同一天内?我需要它为ID 1和ID 11添加一个1,因为它们在表中是两个不同的实例。ID11的1,即使是同一天,也是记录的不同实例。所以他们没有在3张唱片上工作,他们研究了4.那么12和13呢?结果应该和问题中的一样-第二张表这是给几乎所有的东西加1这是给几乎所有的东西加1如果数据如上所述,这确实有效,但我错误地陈述了表数据-我修改了问题以解决这个错误帮助+1@Justin-这就是为什么除了ORDER BY中的JOIN或TIEBRAKER之外,任何东西都不应该依赖自动增量ID的原因-因为不仅会有间隙,但有时id的顺序也与insertedAt时间戳列的等效项不匹配…如果数据如上所述,这确实有效,但我错误地说明了表数据-我修改了问题以解决此错误SQL FIDLE总是有帮助的+1@Justin-这就是为什么任何事情都不应该依赖自动增量ID的原因除了ORDER BYs中的联接或断开连接-因为不仅会有间隙,而且有时id的顺序也与insertedAt时间戳列的等效项不匹配。。。
This will work:

;WITH CTE AS (
        SELECT t1.ID,
               CASE WHEN t1.RecordID <> ISNULL(t2.RecordID,0) THEN 1 ELSE 0 END [Start/END]
            FROM TableName t1
                LEFT JOIN TableName t2
                ON t1.ID = t2.ID + 1

        UNION ALL

        select t1.ID,
                CASE WHEN t1.RecordID <> ISNULL(t2.RecordID,0) THEN 1 ELSE 0 END [Start/END]
            FROM TableName t1
                LEFT JOIN TableName t2
                ON t1.ID = t2.ID - 1

)
UPDATE TableName
SET [Start/END] = 1
    FROM TableName t
        INNER JOIN cte
        ON t.ID = CTE.ID
    WHERE cte.[Start/END] = 1
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 |
;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 |