开发者社区 问答 正文

如何在SQL Server中运行最近365天的插入更新语句

我有一个插入更新存储过程,其中从一个过程获取数据并在表中进行更新。

我的问题是我需要更新表中最近1年的每一天数据。

现在说,如果我需要昨天的数据,我需要在日期2daysprior之前的2天之前给我日期过滤器作为1daysprior ........................... 365daysprior

需要运行该程序365天,这需要付出巨大的努力

有什么办法可以一次运行它吗?

样本数据:

TrendStartDate  TrendEndDate    ToTalCalls  AbnTime
2019-12-22      2019-12-22      42          0
2019-12-21      2019-12-21      464         1016

预期产量:

TrendStartDate  TrendEndDate    ToTalCalls  AbnTime
2019-12-20      2019-12-22      42          0
2019-12-19      2019-12-21      464         1016
2019-12-18      2019-12-19      232         121
2019-12-17      2019-12-18      121         22
2019-12-16      2019-12-17      242         3
2019-12-15      2019-12-16      32          3
2019-12-14      2019-12-15      3221        1
2019-12-13      2019-12-14      11          1

这需要长达365天的时间

展开
收起
祖安文状元 2020-01-05 14:18:09 486 分享 版权
阿里云 AI 助理回答

要一次性运行并更新表中最近一年每一天的数据,你可以使用SQL的窗口函数或者递归查询来实现,但具体实现方式依赖于你使用的数据库类型(如MySQL、PostgreSQL、SQL Server等)。这里我提供一个较为通用的思路和一个基于假设是MySQL数据库的示例。

思路

  1. 确定日期范围:首先你需要确定起始日期(比如昨天的日期)和结束日期(通常是今天或者昨天,取决于你的需求)。
  2. 生成日期序列:利用数据库提供的功能生成这一年内每天的日期序列。
  3. 聚合数据:对于每一天,计算TrendStartDate到这一天的总数据。这可能需要分组聚合或者窗口函数来实现跨行计算。

示例(MySQL)

在MySQL中,你可以使用以下步骤来实现:

1. 生成日期序列

CREATE TEMPORARY TABLE temp_dates AS
SELECT DATE_SUB(CURDATE(), INTERVAL @i := @i + 1 DAY) AS date
FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t,
     (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
     (SELECT @i := -1) var_init
WHERE @i < 365;

这段代码会创建一个临时表temp_dates,包含过去365天的日期。

2. 聚合数据

接下来,假设你的原始数据表名为your_table,并且你想根据TrendStartDate字段进行汇总,可以尝试如下SQL语句:

INSERT INTO your_aggregated_table (TrendStartDate, TrendEndDate, TotalCalls, AbnTime)
SELECT 
    d.date AS TrendStartDate,
    MAX(t.TrendStartDate) AS TrendEndDate,
    SUM(t.TotalCalls) AS TotalCalls,
    SUM(t.AbnTime) AS AbnTime
FROM 
    temp_dates d
LEFT JOIN 
    your_table t ON d.date BETWEEN t.TrendStartDate AND IFNULL(t.TrendEndDate, CURDATE())
GROUP BY 
    d.date;

这个查询会为每一天生成一行记录,其中TotalCallsAbnTime是该日期范围内所有记录的总和。注意,这里假设了如果没有明确的TrendEndDate,则认为数据有效至当前日期(CURDATE())。

请根据你的实际数据库类型和表结构调整上述SQL语句。如果使用的是其他数据库系统,如PostgreSQL或SQL Server,可能会有更高效或更简洁的方式来生成日期序列和执行聚合操作。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答