mysql - 找到每列的最后一个非 NULL 值,然后将它们分组到 MySQL 表中?

标签 mysql sql

我有一张这样的 table :

     uid |      name       | gender | age  | date
    -----+-----------------+--------+------+----------
      38 | Danny Little    | NULL   | NULL | 2018/01/01
      38 | NULL            | NULL   |   24 | 2018/01/02
      41 | NULL            | male   |   40 | 2018/01/03
      43 | OfCourseNewUser | female |   13 | 2018/01/04
      38 | NULL            | NULL   |  100 | 2018/01/05
      38 | ADanny          | male   | NULL | 2018/01/06
      38 | ADanny          | NULL   |   99 | 2018/01/07

我想找到姓名、性别和年龄的最新值(显然来自三个单独的行),其中这些值不为空(如果全部为空值,则设置为空),然后按 uid 分组,结果是这样的:

    uid  |      name       | gender | age
    -----+-----------------+--------+-----
     38  | ADanny          | male   | 99
     41  | NULL            | male   | 40
     43  | OfCourseNewUser | female | 13

我只需要一个查询,它可以在其他数据库中获取LAST_VALUE(column,isignore null)。但MySQL不支持窗口函数。

我怎样才能得到这个结果?

最佳答案

您提到您的 MySQL 不支持窗口函数。然后,我想为什么不使用 LEFT OUTER JOIN 来代替呢?

看看这个:

SELECT u.uid,
       u.name,
       u2.gender,
       u.age,
       u.date
FROM users u
LEFT OUTER JOIN users u2 ON u2.uid = u.uid   AND u.age IS NOT NULL
LEFT OUTER JOIN users u3 ON u3.uid = u2.uid  AND u2.gender IS NOT NULL
GROUP BY uid, name
HAVING 
    u.date = MAX(u.date)
AND u.uid IS NOT NULL
AND u.age IS NOT NULL

输出

| uid |            name | gender | age |       date |
|-----|-----------------|--------|-----|------------|
|  38 |          ADanny |   male |  99 | 2018-01-07 |
|  41 |          (null) |   male |  40 | 2018-01-03 |
|  43 | OfCourseNewUser | female |  13 | 2018-01-04 |

SQLFiddle Demo

关于mysql - 找到每列的最后一个非 NULL 值,然后将它们分组到 MySQL 表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48655966/

相关文章:

php - 检查注册数据然后插入到另一个表中

java - 在 IBM Maximo 中使用 SQL 语句,使用 Java

php - 来自 SQL 的 Laravel Eloquent ORM 聚合函数

php - CakePHP:shell 脚本的 key "PRIMARY' 的重复条目

javascript - 发布请求 express : Cannot set headers after they are sent to the client

php - 如果另一个字段具有特定条件,如何隐藏列值

java - 以跨平台方式维护 Mysql 数据库模式的最佳实践是什么?

mysql - SQL 查询以检索各种 DATE 范围内的 SUM

php - 本地主机 php_network_getaddresses : getaddrinfo failed: No such host is known

mysql - SQL:选择其他查询未选择的所有记录