2013-08-02 14 views
6

Próbuję uzyskać maksymalną wartość mysql select, ale chcę mieć wartość null/empty/0, jeśli istnieje jeden wiersz bez znacznika czasu.MySQL zwraca wartość maksymalną lub zerową, jeśli jedna kolumna nie ma wartości

statystyki stołowe (simplyfied):

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 

jestem teraz chcą uzyskać najniższą datę zamówienia (bez problemu, jako że nigdy nie jest pusty), a maksymalne anulować datę. Jeśli klient anulował już swoją subskrypcję, data anulowania jest wypełniona, ale jeśli jest nadal aktywny, nie ma w ogóle daty anulowania.

zapytania:

SELECT ID, min(ORDER_DATE) AS OD, max(CANCEL_DATE) AS CD FROM stats GROUP BY CLIENT 

Powroty:

ID OD   CD 
5 1213567200     // fine 
6 1210629600 1281736799  // fine 
7 1201042800 1248386399  // Should be empty 
8 1205449200 1271282399  // fine 

nie mogę zrozumieć to jak powrót pusty/0/null jeśli jest jeden (lub więcej) pustych colums dla klienta . Próbowano również z polami NULL.

Dzięki za podpowiedź.

Odpowiedz

5

nie wiem jak szybko to będzie, ale myślę, że to może być rozwiązane tak:

SELECT ID, min(ORDER_DATE) AS OD, 
IF(COUNT(*)=COUNT(CANCEL_DATE),max(CANCEL_DATE),NULL) AS CD 
FROM stats GROUP BY CLIENT 

nie mogłem go przetestować, ale Ideą tego rozwiązania jest to, że należy liczyć count(cancel_date) wszystkie wpisy o wartości null i jeśli są równe count(*), oznacza to, że nie ma żadnych wartości pustych i zwrócą one max(cancel_date), w przeciwnym razie wartość null.

+0

Nie wiem, czy będzie szybszy niż mój, myślę, że mogą być one równoważne, ale to fajny pomysł :) +1 – fthiella

+0

Praca też. Wielkie dzięki. Przez kilka godzin robił mi fiddeling, ale nie miał tego prostego rozwiązania. Prędkość: 0,06 s dla ~ 6k rzędów. Tak więc nieco szybciej niż rozwiązanie Fthiella – Yenky

4

Można użyć kwerendy tak:

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 

proszę zobaczyć skrzypce here.

  • CANCEL_DATE IS NULL będzie badana 0, gdy CANCEL_DATE nie jest pusty, lub 1, gdy jest zerowy
  • MAX(CANCEL_DATE IS NULL) będą oceniane na 0 jeżeli nie ma CANCEL_DATE z wartości zerowych, w przeciwnym wypadku wartość będzie 1.
  • , gdy MAX(CANCEL_DATE IS NULL)=0 oznacza to, że nie ma żadnych wierszy, gdzie CANCEL_DATE ma wartość null, i musimy zwrócić MAX (cancel_date) w takim przypadku, w przeciwnym razie musimy zwrócić NULL.
+0

To działa dobrze, wielkie dzięki! – Yenky

+0

Dla szybkości: potrzebuje 0,07 s na 6k wierszy – Yenky

Powiązane problemy