Неверное значение при использовании функции First_Value в Mysql - PullRequest
1 голос
/ 20 июня 2019

Мне нужно подготовить отчет на основе этой таблицы, который я могу прочитать только:

enter image description here

Идея состоит в том, чтобы иметь последнее значение для каждого наблюдения на основе более высокой идентификации активности. Например, значение для Наблюдения 10 соответствует виду деятельности 19.

enter image description here

Пока это мой код:

select 
first_value(text) over (partition by employee order by case when observation = 10 then activity else 0 end desc) as "Obs 10",
first_value(number) over (partition by employee order by case when observation = 20 then activity else 0 end desc) as "Obs 20",
first_value(dropdown) over (partition by employee order by case when observation = 40 then activity else 0 end desc) as "Obs 40"
-- the same for the rest of the observations
from employee_proc

Однако сотрудник может быть связан с другими наблюдениями, которые не могут быть зарегистрированы в момент выполнения запроса.

Если я добавлю этот код для этого сотрудника:

...
first_value(text) over (partition by employee order by case when observation = 120 then activity else 0 end desc) as "Obs 120",
...

Я получаю неправильное значение вместо нуля (учитывая, что наблюдение еще не зарегистрировано для него).

Как я могу избежать такого результата? Есть ли другой способ получить конечный результат, другой, более оптимизированный?

Привет.

1 Ответ

1 голос
/ 20 июня 2019

Результат, который вы показали в своем вопросе, может быть достигнут более эффективно с помощью запроса ниже:

create temporary table max_activity
select observation,max(activity) from employee_proc group by 1;


select employee,
activity,
MAX(IF(observation = 10, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs10,
MAX(IF(observation = 20, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs20,
MAX(IF(observation = 30, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs30,
MAX(IF(observation = 40, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs40,
MAX(IF(observation = 50, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs50,
MAX(IF(observation = 60, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs60,
MAX(IF(observation = 70, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs70,
MAX(IF(observation = 80, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs80,
MAX(IF(observation = 90, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs90,
MAX(IF(observation = 100, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs100,
MAX(IF(observation = 110, ifnull(TEXT_,ifnull(date_in,ifnull(number,dropdown))),NULL)) AS Obs110
from employee_proc
inner join max_activity
on employee_proc.activity = max_activity.activity
group by 1,2;
...