繁体   English   中英

获取SQL表中两行的最小日期

[英]Get min date across two rows in SQL table

我在SQL中有一个如下所示的表

在此输入图像描述

我想在PR创建日期或AC创建日期字段中选择具有最早日期的行。 所以在这种情况下,我想要这两个记录。

在此输入图像描述

我知道我可以写

Select email, min(PR_create_date) from table 
group by email

但是,这只会在PR_create_date列中找到最小日期。 如何在PR_create_date或AC_create_date列中找到最小日期?

您可以使用

SELECT email,
       MIN(least(pr_create_date, ac_create_date))
  FROM my_table
 GROUP BY email

函数least返回其参数的最小值。

但是如果其中一个参数为NULL那么结果也是NULL 因此,您要编写一些逻辑来处理空值,具体取决于业务逻辑中必须如何处理空值:例如,您可以在远期或将来使用“特殊日期”将空值替换为

SELECT email,
       MIN( least( ifnull(pr_create_date, DATE '2999-12-31'),
                   ifnull(ac_create_date, DATE '2999-12-31')) )
  FROM my_table
 GROUP BY email

但是在最简单的情况下,当日期被排除时(即在每一行中,其中一个日期是空的),它足以写入

SELECT email,
       MIN( ifnull(pr_create_date, ac_create_date) )
  FROM my_table
 GROUP BY email

还有一个解决方案

 select temp.EMAIL, min(temp.PR_AC_CREATE_DATE)
 from
 (
  select EMAIL , min(PR_CREATE_DATE) as PR_AC_CREATE_DATE
  from table
  group by email

  union

  select EMAIL, min(AC_CREATE_DATE)
  from table
  group by email
  ) temp

 group by temp.EMAIL ;

使用COALESCE函数,解决方案是针对通用sql可能在mysql上运行

select email,min(COALESCE(PR_create_date,AC_create_date)) as mindt 
from tab
group by email

您可以尝试更强大的解决方案,例如:

SELECT * FROM (SELECT * FROM my_table ORDER BY pr_create_date DESC,ac_create_date DESC LIMIT 5);

排序依据:指定列和排序规则(升序ASC(默认)/降序DESC)

限制:您想要的记录数。 这将给出前5个最新记录。 试试吧。

Select email,
       Case When PR_create_date < AC_create_date Then PR_create_date
            When AC_create_date < PR_create_date Then AC_create_date             
            End As TheMin
From   YourTableNameHere
Group By email 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM