我尝试获取mysql select的最大值,但是如果有一行不包含时间戳,则希望将其设置为null / empty / 0。
表统计(简称):
ID CLIENT ORDER_DATE CANCEL_DATE
1 5 1213567200
2 5 1213567200
3 6 1210629600 1281736799
4 6 1210629600 1281736799
5 7 1201042800 1248386399
6 7 1201042800
7 8 1205449200 1271282399
我现在想要获得最低订单日期(没问题,因为它永远不会是空的),并且 最长取消日期。如果客户已经取消了他的订阅,则取消日期已被填写,但如果他仍然有效,则根本没有取消日期。
查询:
SELECT ID, min(ORDER_DATE) AS OD, max(CANCEL_DATE) AS CD FROM stats GROUP BY CLIENT
返回:
ID OD CD
5 1213567200 // fine
6 1210629600 1281736799 // fine
7 1201042800 1248386399 // Should be empty
8 1205449200 1271282399 // fine
如果客户端有一个(或多个)空列,我无法弄清楚如何返回空/ 0 / NULL。还尝试使用NULL字段。
感谢任何提示。
答案 0 :(得分:5)
我不知道会有多快,但我想这可以解决这个问题:
SELECT ID, min(ORDER_DATE) AS OD,
IF(COUNT(*)=COUNT(CANCEL_DATE),max(CANCEL_DATE),NULL) AS CD
FROM stats GROUP BY CLIENT
我无法测试它,但这个解决方案背后的想法是count(cancel_date)
应该计算所有非空值条目,如果它等于count(*)
,这意味着没有空值,它将返回max(cancel_date)
,否则返回null。
答案 1 :(得分:4)
你可以使用这样的查询:
SELECT
client,
min(ORDER_DATE) AS OD,
case when MAX(CANCEL_DATE IS NULL)=0 THEN max(CANCEL_DATE) END AS CD
FROM
stats
GROUP BY
CLIENT
请参阅小提琴here。
CANCEL_DATE IS NULL
将被评估为0,或者当它为null时,将被评估为1 MAX(CANCEL_DATE IS NULL)
将被计算为0,否则其值将为1. MAX(CANCEL_DATE IS NULL)=0
表示没有CANCEL_DATE为空的行时,我们需要在这种情况下返回MAX(cancel_date),否则我们需要返回NULL。