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



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

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

我需要更新datetime字段看起来像这样:

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

对于每个站点,我需要使所有的datetime值等于该站点的最小datetime值。我已经玩了一个多小时的聚合函数了,但我似乎不能理解它。我试着在网上寻求帮助,但这是一个很难在搜索引擎中表达的问题。

任何帮助都是感激的。

在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;

注意不需要join,where子句可以防止不必要的更新。

在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;

最新更新