我在SQL
中有一个如下所示的表我想在PR创建日期或AC创建日期字段中选择具有最早日期的行。所以在这种情况下,我想要这两个记录。
我知道我可以写
rows = 6;
matrixB.size = 5;
MPI_Recv(matrixB.matrixPointer[offset], rows*(matrixB.size+1)+10, MPI_DOUBLE, 0, dataMessage, MPI_COMM_WORLD, &status);
但是,这只会在PR_create_date列中找到最小日期。如何在PR_create_date或AC_create_date列中找到最小日期?
答案 0 :(得分:5)
您可以使用
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
答案 1 :(得分:2)
还有一个解决方案:
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 ;
答案 2 :(得分:0)
使用COALESCE函数,解决方案是针对通用sql可能在mysql上运行
select email,min(COALESCE(PR_create_date,AC_create_date)) as mindt
from tab
group by email
答案 3 :(得分:0)
您可以尝试更强大的解决方案,例如:
SELECT * FROM (SELECT * FROM my_table ORDER BY pr_create_date DESC,ac_create_date DESC LIMIT 5);
排序依据:指定列和排序规则(升序ASC(默认)/降序DESC)
限制:您想要的记录数。这将给出前5个最新记录。 试试吧。
答案 4 :(得分:-1)
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