将所有出现的日期时间更新为该日期的最低日期时间值

Posted

技术标签:

【中文标题】将所有出现的日期时间更新为该日期的最低日期时间值【英文标题】:Update all occurrences of a datetime to the lowest datetime value for that date 【发布时间】:2021-10-24 03:48:59 【问题描述】:

我有一张表,其中包含许多日期的许多日期时间值。我需要更新我的表,以便将每个日期更新为该日期的最低日期时间值。例如,如果这是我的桌子:

Station     DateTime
Stn 1   2014-03-26 09:50:00.000
Stn 1   2014-03-26 09:52:00.000
Stn 1   2014-03-26 09:55:00.000
Stn 2   2015-12-26 11:30:00.000
Stn 2   2015-12-26 11:32:00.000
Stn 2   2015-12-26 11:35:00.000

我需要将日期时间字段更新为如下所示:

Station     DateTime
Stn 1   2014-03-26 09:50:00.000
Stn 1   2014-03-26 09:50:00.000
Stn 1   2014-03-26 09:50:00.000
Stn 2   2015-12-26 11:30:00.000
Stn 2   2015-12-26 11:30:00.000
Stn 2   2015-12-26 11:30:00.000

对于每个站,我需要使所有日期时间值等于该站的最小日期时间值。我已经玩了一个多小时的聚合函数,但我似乎无法理解。我试过在线寻求帮助,但这是一个很难在搜索引擎中表达的问题。

感谢任何帮助。

【问题讨论】:

用您使用的数据库标记您的问题。 @forpas,完成,谢谢。 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。 【参考方案1】:

在 SQL Server 中,您可以使用可更新的 CTE:

with toupdate as (
      select t.*,
             min(time) over (partition station, convert(date, time)) as min_time
      from t
     )
update toupdate
    set time = min_time
    where time <> min_time;

请注意,不需要joinwhere 子句可防止不必要的更新。

【讨论】:

【参考方案2】:

在 CTE 中使用 MIN() 窗口函数来获取每个站点和日期组合的 Time 的最小值。 在UPDATE 语句中将表连接到 CTE:

WITH cte AS (
  SELECT *, MIN(Time) OVER (PARTITION BY Station, CONVERT(DATE, Time)) min_time
  FROM tablename
)
UPDATE t
SET t.Time = c.min_time
FROM tablename t INNER JOIN cte c 
ON c.Station = t.Station AND c.Time = t.Time;

【讨论】:

那个CTE是可以直接更新的,不需要再上表了。

以上是关于将所有出现的日期时间更新为该日期的最低日期时间值的主要内容,如果未能解决你的问题,请参考以下文章

选择日期最小的所有行[关闭]

如何找到最高(最新)和最低(最早)日期 [R]

显示日期和时间,列出所有登录的用户,给出系统的更新时间,最后将所有信息保存到日志文件中

如果所有记录在水晶报表中具有相同的日期,如何仅显示一个日期

SQL - 从单列到两列的所有日期组合

SQL Server 编程 - 按给定天数更新所有日期