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