sql оракул на даты с возможностями нулевых значений - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть таблица с emplid и end_date столбцами. Я хочу от всех исключений max end_dates. Если хотя бы одна end_date имеет значение null, я хочу, чтобы значение NULL было макс. Итак, в этом примере:

emplid    end_date
1         05/04/2019
1         05/10/2019
1         null
2         05/04/2019
2         05/10/2019

хочу как результат:

emplid    end_date
1         null
2         05/10/2019

Я пробовал что-то вроде

select emplid, 
       CASE 
          WHEN MAX(NVL(end_Date,'01/01/3000'))='01/01/3000' THEN null 
          ELSE end_date 
        END as end_dt 
from people 
group by emplid

тогда я получаю групповую ошибку.

Может быть, это очень легко, но я не понимаю, как правильно получить то, что я хочу.

Ответы [ 5 ]

3 голосов
/ 05 апреля 2019
with s(id, dt) as (
select 1, to_date('05/04/2019', 'dd/mm/yyyy') from dual union all
select 1, to_date('05/10/2019', 'dd/mm/yyyy') from dual union all
select 1, null                                from dual union all
select 2, to_date('05/04/2019', 'dd/mm/yyyy') from dual union all
select 2, to_date('05/10/2019', 'dd/mm/yyyy') from dual)
select id, decode(count(dt), count(*), max(dt)) max_dt
from s
group by id;

        ID MAX_DT                       
---------- -----------------------------
         1                              
         2 2019-10-05 00:00:00  
2 голосов
/ 05 апреля 2019

Я бы просто сделал:

select emplid,
       (case when count(*) = count(end_date)
             then max(end_date)
        end) as max_end_date
from t
group by emplid;

Нет причин вводить "магическое" максимальное значение (даже если оно правильное).

Первое выражение в case просто спрашивает: «Соответствует ли число не-1007 * end-date значений количеству строк».

0 голосов
/ 05 апреля 2019

Вы можете использовать NVL, чтобы преобразовать ноль в максимально возможную дату, и ISNULL, чтобы преобразовать эту дату обратно в ноль:

SELECT emplid, NULLIF(MAX(NVL(end_date, date '9999-12-31')), date '9999-12-31')
FROM cte
GROUP BY emplid

Демонстрация в db <> fiddle

0 голосов
/ 05 апреля 2019

Случай не идет с group by, вы должны сначала получить максимальное значение, используя group, а затем оценить нулевые значения.Попробуйте ниже.

select empid, CASE WHEN NVL(eDate,'01-DEC-3000')='01-DEC-3000' THEN null ELSE edate end  end_dt  from (
select empid, MAX(NVL(eDate,'01-DEC-3000')) eDate
from 
(select 1 empid, sysdate-100 edate from dual union all
select 1 empid, sysdate-10 edate from dual union all
select 1 empid, null edate from dual union all
select 2 empid, sysdate-105 edate from dual union all
select 2 empid, sysdate-1 edate from dual ) datad
group by empid);
0 голосов
/ 05 апреля 2019

Попробуйте это

SELECT
    EMPLID,
    CASE WHEN END_DATE='01/01/3000' THEN NULL ELSE END_DATE END AS END_DT
FROM
    (
        SELECT EMPLID, MAX(END_DATE) AS END_DATE FROM 
            (
                SELECT EMPLID, NVL(END_DATE,'01/01/3000') AS END_DATE FROM PEOPLE
            )
        GROUP BY EMPLID
    );
...