这有点难以解释......(这是使用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.
非常感谢任何帮助。谢谢!
答案 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 function
。 mysql
并不是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