2016-08-19 4 views
0

У меня есть таблица А как это:Как отобразить максимальное значение из группы столбцов. Максимальное значение должно отличаться от рисунка

ID | L1 |L2 | Date   
-- |----- |---- | --------- 
1 | A | B | 2003-01-01 
---|------|-----|---------- 
2 | A | B | 2004-05-01 
---|------|-----|---------- 
3 | B | C | 2003-01-01 
---|------|-----|----------- 
4 | B | C | 9999-12-31 
---|------|-----|----------- 
5 | C | D | 1998-02-03 
---|------|-----|----------- 
6 | C | D | 2004-05-01 

Нормальная ситуация, когда для пары букв (AB, BC, CD) является дата = «9999-12-31» , Поэтому для двух пар букв (AB, CD) я пропущу дату «9999-12-31» , и мне нужно написать запрос, чтобы увидеть эти буквы и идентификаторы.

Я написал запрос типа (чтобы увидеть дату макс пары букв)

select distinct L1, L2, max(date) from A GROUP BY 
L1, L2 
having max(date)<>'9999-12-31' 

Этот запрос показывает правильные строки, но мне нужно также увидеть идентификаторы и это то, что я не мог этого сделать. Кто-нибудь знает, как написать запрос, чтобы увидеть идентификаторы? ID всегда уникален

Спасибо!

+0

Это неясно. Таким образом, вы исключаете B, C, потому что по крайней мере одна строка имеет дату в 9999. Это кажется ясным. Но тогда, для A, B вам нужны обе строки или только одна с наивысшей датой? То же самое для C, D. – mathguy

+0

Я хочу отобразить в запросе самую высокую дату для этой пары букв, у которых нет даты = '9999-12-31'. Поэтому в результате запроса мне нужно иметь A, B и C, D с наивысшими датами для обоих. –

ответ

0

Попробуйте not exists:

select a.* 
from a a 
where not exists (select 1 
        from a a2 
        where a2.l1 = a.l1 and a2.l2 = a.l2 and 
         a2.date = '9999-12-31' 
       ); 

Это предполагает, что столбец «Дата» хранится в виде строки, или что у вас есть настройки формата даты так '9999-12-31' правильно интерпретированы (как это предлагается по Вашему запросу образца). В противном случае, вы можете использовать:

a2.date = date '9999-12-31' 

EDIT:

Если вы хотите самую высокую дату l1/l2` комбо, которые не имеют максимум, который легко:

select l1, l2, max(date) 
from a 
group by l1, l2 
having max(date) < date '9999-12-31'; 
+0

Один вопрос, который на моем нерве. Вы получаете деньги от SO? Кем вы работаете? Отвечая здесь? Я говорю это, потому что вы здесь все время. Так что вы здесь? – stack

+0

@RGS Вы большой приверженец его ответов? Хех .. Когда я задаю вопрос о базе данных, я жду ** только ** за его ответ, и я полагаюсь на его ответы в качестве документации .. Так что я думаю, что я больше сторонник, чем вы ':-)' .. Но ты знаешь? Это странно. Почему он проводит здесь много времени? Какую выгоду он получает от активации здесь? – stack

+0

Привет, Гордон! Спасибо за ваш запрос, но он не соответствует критериям задачи, потому что он показывает все даты для этих двух L1, L2, у которых нет даты = 9999-12-31, но мне нужно увидеть наивысшую дату для этих пары, у которых нет даты = 9999-12-31 .... Знаете ли вы, как писать подобное? –

1

Гордон предложил решение, если вы хотите, чтобы все строки для пар L1, L2 не имели даты, равной 9999-12-31.

Это решение на тот случай, если вы ищете только пар L1, L2, у которых нет даты, равной 9999-12-31, и для этой пары вам нужна только строка с последней датой.

with 
    table_A (id, l1, l2, dt) as (
     select 1, 'A', 'B', date '2003-01-01' from dual union all 
     select 2, 'A', 'B', date '2004-05-01' from dual union all 
     select 3, 'B', 'C', date '2003-01-01' from dual union all 
     select 4, 'B', 'C', date '9999-12-31' from dual union all 
     select 5, 'C', 'D', date '1999-02-03' from dual union all 
     select 6, 'C', 'D', date '2004-05-01' from dual 
    ) 
select id, l1, l2, dt 
from (
     select id, l1, l2, dt, 
       row_number() over (partition by l1, l2 order by dt desc) rn 
     from table_A 
    ) 
where rn = 1 
and dt != date '9999-12-31' 
; 

    ID L1 L2 DT     
------ -- -- ------------------- 
    2 A B 2004-05-01 00:00:00 
    6 C D 2004-05-01 00:00:00 
+0

Благодарим вас за ответ. Однако я не могу применить ваше решение, потому что значения из таблицы A жестко запрограммированы (в CTE). Таблица, которую я предоставил, является просто «образцом» моей реальной таблицы. Моя реальная таблица имеет более 5 миллионов строк и слишком много комбинаций из 4 столбцов. Невозможно написать такой запрос, как ваш ... У вас есть другая идея? Какое-то динамическое (не жестко закодированное) решение? –

+0

Если у вас есть свой собственный стол, вам не нужно «table_A» из моего решения. Запрос начинается с 'select id, l1, l2, dt ...' - просто убедитесь, что ваша таблица называется 'table_A', или если она не просто изменит имя в условии FROM. Созданный мной CTE является очень распространенным способом добавления некоторых тестовых данных, но он не является частью решения. – mathguy

+0

ОК. Знаете ли вы, как может выглядеть решение, которое мне нужно? –

Смежные вопросы