Сколько клиентов перешло с продукта A на продукт B?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

0
задан sql_user_2019 5 April 2019 в 17:40
поделиться

2 ответа

Вы хотите использовать lag() для этого, но вы должны быть осторожны с фильтрацией даты. Итак, я думаю, вы хотите:

SELECT prev_membership_type, membership_type,
       COUNT(*) as num_changes,
       COUNT(DISTINCT member) as num_members
FROM (SELECT mddc.*,
             LAG(mddc.membership_type) OVER (PARTITION BY mddc.customer_id ORDER BY mddc.date) as prev_membership_type
      FROM member_detail_daily_changes_new mddc
     ) mddc
WHERE prev_membership_type <> membership_type AND
      date >= '2018-01-01' AND
      date < '2019-01-01'
GROUP BY membership_type, prev_membership_type;

Примечания:

  • Фильтрация по date должна произойти после вычисления lag().
  • При этом учитывается, что члены могут иметь определенный тип в 2017 году, а затем перейти на новый тип в 2018.
  • Фильтрация даты совместима с индексами.
  • Рассчитаны два значения. Одним из них является общее количество изменений. Другой подсчитывает каждого члена только один раз для каждого типа изменений.
0
ответ дан Gordon Linoff 5 April 2019 в 17:40
поделиться

С условной агрегацией после самостоятельного присоединения к таблице:

select 
  2018 fiscal, 
  sum(case when m.member_type_cd > t.member_type_cd then 1 else 0 end) upgrades, 
  sum(case when m.member_type_cd < t.member_type_cd then 1 else 0 end) downgrades 
from member_detail_daily_changes_new m inner join member_detail_daily_changes_new t
on 
  t.customer = m.customer 
  and 
  t.changedate = (
    select max(changedate) from member_detail_daily_changes_new
    where customer = m.customer and changedate < m.changedate
  )
where year(m.changedate) = 2018 

Это будет работать, даже если существует более 2 типов уровня членства.

0
ответ дан forpas 5 April 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: