【问题标题】:update with the latest date用最新日期更新
【发布时间】:2014-01-06 02:35:58
【问题描述】:

我有一张如下图的表格:

我需要将它们更新为最新的last_order_date,如下表所示:

我有 20000 多条记录,我需要一次查询来更新它们。

感谢您花时间看它。

【问题讨论】:

  • 那为什么不删除没有最新订单日期的记录呢?它肯定会让你的故事保持第一种正常形式。怎么说?
  • 由于字段 'cust_id' 有不同的值,您可能需要考虑使用另一种语言编写脚本并在 SQL 结果之后操作结果,因为通常建议避免在数据库级别出现循环。跨度>
  • 我同意@Rachcha - 几乎没有充分的理由让表有重复的行。如果这是表中的唯一信息,请删除多余的行。如果还有更多,您可能需要重新考虑您的结构(在网络上发布以获得更集中的帮助)。谢天谢地,您的数据是一种可很好排序的格式 - 它是实际的日期类型吗?

标签: sql sql-server sql-server-2008 sql-update


【解决方案1】:

在最大计算子查询上使用连接

UPDATE t
SET t.last_order_date =a.maxDate
FROM tableName t
INNER JOIN
 ( SELECT cust_id ,MAX(last_order_date) As maxDate
   FROM tableName GROUP BY cust_id ) a
ON a.cust_id =t.cust_id 

【讨论】:

    【解决方案2】:

    这应该适合你:

    UPDATE [table_name] 
    SET    last_order_date = (SELECT Max([b].last_order_date) 
                              FROM   [table_name] [b] 
                              WHERE  [b].cust_id = [table_name].cust_id); 
    

    【讨论】:

    • 我建议加入一个按 cust_id 分组的子查询,这样查询只运行一次,而不是每行运行一次。
    • @TimothyWalters - 我知道(至少最近的版本)支持这种语法,但并不是所有的 RDBMS 都支持(我在看着你,DB2 for I);那么这是一个有效的多平台查询。不知道SQL Server能不能把这个优化成join版本(我觉得DB2也许可以,但是太长了,我没有实例)?
    • @Clockwork-Muse 鉴于该问题已标记为 SQL Server 2008,我认为特定于该问题的答案是有效的。虽然提供多平台答案可能是有效的,但这意味着要以最低的公分母工作,非常适合学术答案,但对于“在您的实际应用程序中使用它”的答案来说并不那么好。关于 SQL-Server 是否可能/可能不将其优化为 JOIN,我不想依赖它,因为我更喜欢一开始就编写好的 SQL。
    【解决方案3】:

    您可以使用 window MAX() 计算 CTE 中的最大日期,然后在主 (UPDATE) 语句中引用 CTE:

    WITH maxdates AS (
      SELECT
        last_order_date,
        actual_last_order_date = MAX(last_order_date) OVER (PARTITION BY cust_id)
      FROM atable
    )
    UPDATE maxdates
    SET last_order_date = actual_last_order_date
    ;
    

    但是,像这样复制这条信息似乎没有多大意义。您可能应该考虑将last_order_date 存储在以cust_id 为主键的表中(可能是一些customers 表)。甚至放弃将其存储在表中并每次动态计算:20,000 行并不是那么多。 (除非您认真期望该数字会迅速增长。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      相关资源
      最近更新 更多