6

mysql select の最大値を取得しようとしましたが、タイムスタンプを含まない行が 1 つある場合は 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

クライアントに空の列が 1 つ (または複数) ある場合、空/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)null 値以外のすべてのエントリをカウントする必要があり、それが等しい場合count(*)は null 値がないことを意味し、それ以外の場合は null を返し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 NULLCANCEL_DATE が null でない場合は 0 に評価され、null の場合は 1 に評価されます。
  • MAX(CANCEL_DATE IS NULL)null 値の cancel_date がない場合は 0 と評価され、それ以外の場合は 1 と評価されます。
  • CANCEL_DATE が null の行がないことを意味し、その場合MAX(CANCEL_DATE IS NULL)=0は MAX(cancel_date) を返す必要があり、それ以外の場合は NULL を返す必要があります。
于 2013-08-02T09:47:23.353 に答える