gpt4 book ai didi

mysql - 用平均值填充表中 NULL-s 的空白

转载 作者:行者123 更新时间:2023-11-29 08:34:30 25 4
gpt4 key购买 nike

我有一个表,其中包含字段(id,letter,date)和其中的一些数据:

1 A 2012-01-01
2 B NULL
3 C NULL
4 D 2012-01-15

我想用最近的非 NULL 值的平均日期填充 NULL 值。像这样:

1 A 2012-01-01
2 B 2012-01-08
3 C 2012-01-08
4 D 2012-01-15

或者,也许,甚至像这样:

1 A 2012-01-01
2 B 2012-01-08
3 C 2012-01-11
4 D 2012-01-15

两种变体都很棒。有没有简单的方法在 MySQL 中实现?

提前致谢

UPD 表相当大,大约有 700.000 条记录,以及大约 50.000 个与描述的间隙。

UPD2 更清晰一些:表格可能是这样的:

1 A 2012-01-01
2 B NULL
3 C NULL
4 D 2012-01-15
5 E NULL
6 F 2012-01-17
7 G NULL
8 H NULL
9 I 2012-01-20

预期结果如下:

1 A 2012-01-01
2 B **2012-01-08**
3 C **2012-01-08**
4 D 2012-01-15
5 E **2012-01-16**
6 F 2012-01-17
7 G **2012-01-18**
8 H **2012-01-18**
9 I 2012-01-20

(星号表示更改的值)。谢谢

UPD3 感谢大家。但我会以另一种方式做到这一点,用一个简单的公式计算日期:need_date = [(max(date)-min(date))/(max(id)-min(id)]*(my_ID-min(id) )) + 分钟(日期)

最佳答案

假设您有一个名为 T 的表,如下所示:

CREATE TABLE T(
id INT,
time DATETIME
);

以下查询将为您提供每个 NULL 记录的边界:

SELECT T.Id
, MAX(T1.Time) as MinDate
, MIN(T2.Time) as MaxDate
FROM T
INNER JOIN T T1 ON T1.Id < T.Id
AND T.time IS NULL
AND NOT T1.time IS NULL
INNER JOIN T T2 ON T2.id > T.id
AND T.time IS NULL
AND NOT T2.time IS NULL
GROUP BY Id

输出将是:

Id  MinDate     MaxDate
2 2012-01-01 2012-01-15
3 2012-01-01 2012-01-15

因此下一步是使用此结果集中的值进行更新,例如用平均值更新 NULL。

UPDATE T
INNER JOIN
(
SELECT T.Id, MAX(T1.Time) as MinTime, MIN(T2.Time) as MaxTime
FROM T
INNER JOIN T T1 ON T1.id < T.id
AND T.time IS NULL
AND NOT T1.time IS NULL
INNER JOIN T T2 ON T2.id > T.id
AND T.time IS NULL
AND NOT T2.time IS NULL
GROUP BY T.ID) T3
ON T3.id = T.id
SET T.time = FROM_UNIXTIME((UNIX_TIMESTAMP(T3.MinTime) + UNIX_TIMESTAMP(T3.MaxTime)) / 2)
WHERE T.time IS NULL

<强> Working SQLFiddle Here

关于mysql - 用平均值填充表中 NULL-s 的空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com