SQL:获取最大值,但如果特定ID缺少某个字段,则忽略所有值

时间:2016-08-09 21:22:08

标签: sql

这有点难以解释......(这是使用SQL Assistant for Teradata,我并不太熟悉)。

ID         creation_date        completion_date       Difference
123          5/9/2016             5/16/2016             7
123          5/14/2016            5/16/2016             2
456          4/26/2016            4/30/2016             4
456          (null)               4/30/2016             (null)
789          3/25/2016            3/31/2016             6
789          3/1/2016             3/31/2016             30

ID可能包含多个creation_date,但它始终具有相同的completion_date。如果为ID的所有记录填充了creation_date,我想返回具有最新creation_date的记录。但是,如果缺少给定ID的ANY creation_date,我想忽略与此ID关联的所有记录。

鉴于上述数据,我想回复:

ID         creation_date        completion_date       Difference
123          5/14/2016            5/16/2016             2
789          3/25/2016            3/31/2016             6

456没有返回任何记录,因为第二条记录缺少creation_date。具有最新creation_date的记录将返回123和789.

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

根据您的数据库,这是使用row_number获取每组max日期的一个选项。然后,您可以使用not exists过滤这些结果,以检查null值:

select *
from (
    select *, 
        row_number() over (partition by id order by creation_date desc) rn
    from yourtable
) t
where rn = 1 and not exists (
    select 1
    from yourtable t2
    where t2.creationdate is null and t.id = t2.id
)

row_number是许多数据库支持的window functionmysql并不是user-defined variables,但您可以使用conditional aggregation获得相同的结果。

以下是使用select t.* from yourtable t join (select id, max(creation_date) max_creation_date from yourtable group by id having count(case when creation_date is null then 1 end) = 0 ) t2 on t.id = t2.id and t.creation_date = t2.max_creation_date 的更通用的版本:

inline