6

我尝试获取 mysql 选择的最大值,但如果有一行不包含时间戳,则希望它为 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 字段。

感谢您的任何提示。

4

2 回答 2

7

我不知道它会有多快,但我想它可以这样解决:

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),否则为空。

于 2013-08-02T10:02:04.390 回答
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

在此处查看小提琴。

  • CANCEL_DATE IS NULL将被评估为 0,当 CANCEL_DATE 不为空时,或为 1,当它为空时
  • MAX(CANCEL_DATE IS NULL)如果没有带有 null 值的 cancel_date,将被评估为 0,否则其值为 1。
  • MAX(CANCEL_DATE IS NULL)=0这意味着没有 CANCEL_DATE 为空的行时,我们需要在这种情况下返回 MAX(cancel_date),否则我们需要返回 NULL。
于 2013-08-02T09:47:23.353 回答