代码之家  ›  专栏  ›  技术社区  ›  Karl

表中的最高日期的SQL更新值

  •  0
  • Karl  · 技术社区  · 15 年前

    我有以下问题:

    假设我有一个包含以下字段的表: [身份证] [开始日期] [状态日期] [状态描述]

    [ID]不是唯一的,因此我可能有:

    ID  Start Date   Status Date      Status
    123 01/01/2009  01/01/2009       Start
    123 01/01/2009  01/02/2009       Change
    123 01/01/2009  01/03/2009       Change
    123 01/01/2009  01/07/2009       Stop
    

    我要做的是:对所有记录运行insert-into,其中[status]=“start”。

    完成后,我不知道如何做的部分如下:我想将[状态日期]和[状态]更新为最终状态日期。也就是说,我想要的是:

    ID  Start Date   Status Date      Status
    123 01/01/2009  01/07/2009       Stop
    

    有什么建议吗?

    [编辑]

    我正在使用SQL Server 2008

    使用insert into,我的意思是创建一个新的表,并且只插入那些状态为“start”的记录,从而获得一个具有唯一ID的表。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Maximilian Mayerl    15 年前

    我不确定我是否明白你的意思。您想要任何ID的最新日期和状态吗?

    那就是:

    SELECT    a.ID, a.StatusDate, a.Status
    FROM      Table AS a
    INNER JOIN 
    (
        SELECT   ID, Max(StatusDate) AS StatusDate
        FROM     Table
        GROUP BY ID
    ) AS b
    ON        a.ID = b.ID
    AND       a.StatusDate = b.StatusDate
    

    现在,您想用这个更新什么表?“在所有记录上运行insert-into,其中[status]=‘start’”是什么意思?是否创建了第二个表并将此日期插入其中?

    编辑:

    好吧,那么我想你想更新这个新创建的表中的数据吗?

    尝试此操作(我希望此操作中没有语法错误,我现在没有SQL Server来尝试此操作):

    UPDATE    c
    SET       c.StatusDate = a.StatusDate,
              c.Status = a.Status
    FROM      NewTable AS c
    INNER JOIN Table AS a
    ON        c.ID = a.ID
    INNER JOIN 
    (
        SELECT   ID, Max(StatusDate) AS StatusDate
        FROM     Table
        GROUP BY ID
    ) AS b
    ON        a.ID = b.ID
    AND       a.StatusDate = b.StatusDate
    
        2
  •  0
  •   Del    15 年前

    我假设您只想更新status=“start”to status=“stop”and[status date]=now()(now()或其他类似的结果,具体取决于数据库)?

    对不起,如果这听起来不清楚,但我不太确定你在问什么。

        3
  •  0
  •   Aaron Bertrand    15 年前

    你为什么需要 更新 有什么事吗?如果您可以从数据中确定哪个值具有最高的日期,则没有理由存储它。所做的就是引入不一致的可能性…现在,每次添加、更改或删除一行时,都需要更新所有内容。讨厌。

        4
  •  0
  •   HLGEM    15 年前

    这是你想要的吗?它为每个状态为“开始”的记录创建一个新记录,并添加一个状态为“停止”,但仅当停止记录当前不存在时才添加。

    Insert into my table (ID  Start Date   Status Date      Status)
    select ID  Start Date   Status Date      'Stop'
    From mytable  mt 
    left join mytable mt2 on mt.id = mt2.id and mt2.status = 'stop'
    where mt.status = 'Start'
    and mt2.id is null