这是一个示例表:
sample_id | timestamp | p_id
============================================
62054 | 2018-09-25 10:18:15 | 2652
62054 | 2018-09-27 16:44:57 | 966
62046 | null | 1809
62046 | 2018-09-25 10:18:15 | 2097
我们需要筛选出唯一的sample\u id列,但逻辑是
如果timestamp列为null,则返回那些null列数据
62046 | null | 1809
如果timestamp列不为空,则返回最新的timestamp列数据
62054 | 2018-09-27 16:44:57 | 966
如果有人提供sql查询,那就太好了。
我们需要这样的东西,
WHERE
IF(
NOT NULL = all row group by sample_id,
row where cancelled_at is maximum,
null column
)
4条答案
按热度按时间ne5o7dgx1#
在上分组
sample_id
.使用if()函数,检查组的时间戳的最小值是否为
null
不管怎样。如果是的话null
,返回null
,否则返回max()值。尝试以下查询:
mf98qq942#
此查询应提供所需的结果。它寻找一排有
NULL
时间戳,或具有non-NULL
timestamp是该sample\u id的最大时间戳,但仅当该sample\u id没有具有NULL
时间戳:输出:
4xrmg8kj3#
找出那些时间不为null的记录,过滤掉timestamp nulls sample\u id,对于null timestamp使用union
klr1opcd4#
使用变量:
演示
说明:
要了解其工作原理,您需要执行子查询并检查它产生的输出:
输出:
你可以在这里看到计算出来的场
seq
用于对每个sample_id
切片。注意:如果您使用的是mysql 8.0,那么可以使用窗口函数来实现相同的逻辑。