【问题标题】:MySQL for averaging missing datesMySQL 用于平均缺失日期
【发布时间】:2012-04-21 14:45:16
【问题描述】:

我希望通过平均该行之前和之后最近 id 的日期来更新 date 列为 NULL 的行。

在下面的数据中,它会将 ID 为 26 的行更新为 2011-10-19

什么 MySQL 语句可以完成这个?


附加说明:

数据看起来像这样:

id     date           title
--------------------------------------------
12     2011-09-01     Example One
23     2011-10-02     Example Two
26     NULL           Example Three
27     2011-11-05     Example Four
29     2012-01-05     Example Five
37     NULL           Example Six
38     2012-02-03     Example Seven
--------------------------------------------

我不想使用过程。

到目前为止,我已经...

UPDATE `table`
    SET `date`=
         (AVG(
              (SELECT `date` FROM `table` WHERE `id`< ID_OF_PARENT_QUERY AND `date` IS NOT NULL LIMIT 1),
              (SELECT `date` FROM `table` WHERE `id`> ID_OF_PARENT_QUERY AND `date` IS NOT NULL LIMIT 1)
         ))

    WHERE `date` IS NULL

【问题讨论】:

  • 你可以有多个连续的NULL 值吗?如果是这样,您将如何进行?
  • @MostyMostacho - 是的。我想找到最近的行(通过唯一 ID),其中有一个 date 值集。

标签: mysql date window-functions


【解决方案1】:
UPDATE tableX AS t
  JOIN tableX AS next
    ON next.id =
       ( SELECT MIN(n.id)
         FROM tableX AS n
         WHERE n.id > t.id
           AND n.dateX IS NOT NULL
       )
  JOIN tableX AS prev 
    ON prev.id =
       ( SELECT MAX(p.id)
         FROM tableX AS p
         WHERE p.id < t.id
           AND p.dateX IS NOT NULL
       )
SET t.dateX = prev.dateX + INTERVAL (DATEDIFF(next.dateX, prev.dateX) / 2) DAY
WHERE t.dateX IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2018-02-05
    相关资源
    最近更新 更多