【问题标题】:Update temp table with min datetime of multiple columns使用多列的最小日期时间更新临时表
【发布时间】:2021-03-09 13:38:40
【问题描述】:

如何更新我的#temp 表中的以下列“LowestFinishDate”以保存列 [“Finished_OldDate”、“Finished_NewDate”和“Current_FinishedDate”] 的绝对最小值?

这是 Parent0000 的表格的样子:

所以在这种情况下,我希望将 Parent0000 的 #temp.[LowestFinishDate] 中的所有 7 行更新为最低日期,即:

2020-11-25 14:15.

我已尝试执行 CROSS/OUTER APPLY 并使用表值构造函数,但由于某种原因,每个 LowestFinishDate 行都会使用 Current_FinishedDate 的对应值进行更新。

提前致谢

【问题讨论】:

    标签: sql sql-server join min


    【解决方案1】:

    一种方法是将MIN 与子查询和VALUES 表结构一起使用:

    UPDATE YT
    SET LowestFinishedDate = (SELECT MIN(V.FinishDate)
                              FROM (VALUES (YT.FinishedOldDate),
                                           (YT.FinishedNewDate),
                                           (YT.CurrentFinishDate)) V(FinishDate)
                              WHERE V.FinishDate IS NOT NULL)
    FROM dbo.YourTable;
    

    【讨论】:

      【解决方案2】:

      在 SQL Server 中,我倾向于这样写:

      with toupdate as (
            select t.*,
                   min(least_date) over (partition by t.parentid) as new_lowestfinishdate
            from #temp t cross apply
                 (select min(dte) as least_date
                  from (values (t.Finished_OldDate),
                               (t.Finished_NewDate)
                               (t.Current_FinishedDate)
                       ) v(dte)
                 ) v
           )
      update toudpate
          set lowestfinishdate = new_lowestfinishdate;
      

      cross apply 采用每行中日期的最小值。然后窗口函数在所有行中为父 id 取最小值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多