首页 > 解决方案 > mysql查询根据两种逻辑过滤掉数据

问题描述

这是一个示例表:

  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_id 列,但逻辑是

  1. 如果时间戳列是 null,则返回那些 null 列数据

        62046 | null | 1809
    
  2. 如果时间戳列不为空,则返回最新的时间戳列数据

     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
)

标签: mysqlsql

解决方案


此查询应为您提供所需的结果。它查找具有NULL时间戳的行,或具有时间戳的行,该non-NULL时间戳是该 sample_id 的最大时间戳,但前提是该 sample_id 没有具有NULL时间戳的行:

SELECT *
FROM table1 t1
WHERE timestamp IS NULL OR
      timestamp = (SELECT MAX(timestamp) 
                   FROM table1 t2 
                   WHERE t2.sample_id = t1.sample_id) AND
                   NOT EXISTS (SELECT * 
                               FROM table1 t3
                               WHERE t3.sample_id = t1.sample_id AND
                                     t3.timestamp IS NULL)

输出:

sample_id   timestamp               p_id
62054       2018-09-27T16:44:57Z    966
62046       (null)                  1809

推荐阅读