2017-01-30 7 views
0

Это кажется прямым, но мне трудно понять это. У меня есть таблица, где я сравниваю записи внутри группы (group_id). Я дал свои записи флаг, основанный на определенных критериях, которые были уместны для моего исследования. Есть около 10 флагов, которые мне нужно посмотреть. В некоторых случаях в пределах группы помещается только одна запись. В других случаях обе записи помечены.Как я могу сделать «раздел» внутри группы на основе критериев?

Что мне сейчас нужно сделать, это разделить мой group_id на основе дат для каждого обозначения флага. У меня есть 3 периода времени, на которые я хотел бы обратить внимание: 2016, 2010 -2015, до 2010 года, и обе записи одинаковы. Они отражены в моем поле «file_date», которые не настроены как данные типа даты. вместо этого у них есть abcsum (лето) и abcwin (зима) обозначение, с годом. В некоторых случаях это поле имеет значение NULL.

Что я хотел бы сделать, это создать еще один флаг, который будет иметь «победитель» раздела, на основе которого был выбран один из этих критериев даты. Важность критериев от последнего к последнему. Вот некоторые примеры данных, я надеюсь, объяснять его дальше:

------------------------------ 
|group_id | file_date | flag | 
------------------------------- 
| a  | abcsum16 | 3 | 
| a  | abcwin16 |  | 
| b  | null  | 4 | 
| b  | abcsum15 | 4 | 
| c  | abcwin16 | 7 | 
| c  | abcwin16 | 7 | 
| d  | abcsum09 | 3 | 
| d  | null  |  | 
------------------------------- 

Выход будет:


|group_id | file_date | flag | date_flag | 
-------------------------------------------- 
| a  | abcsum16 | 3 | 1  | 
| b  | abcsum15 | 4 | 2  | 
| c  | abcwin16 | 7 | 0  | 
| c  | abcwin16 | 7 | 0  | 
| d  | abcsum09 | 3 | 3  | 
------------------------------------------- 
+0

Это неясно. Как вы назначили значения (0, 1, 2, 3) на date_flag? Существует три «класса» по дате (2016, 2010-2016 и «до 2009 года»). Что означает «обе записи одинаковы» и как это влияет на дату_flag? И почему строки с «flag = NULL» исчезают из вывода? – mathguy

+0

К сожалению, флаги даты следующие: 1 = в 2016 году, 2 = между 2010 и 2015 годами и 3 - это что-то> 2010, в некоторых случаях у меня есть обе записи с тем же «file_date», это те, которые будут принимать 0, так как я не могу различить две даты. Причина, по которой я не включал нулевые поля, состоит в том, что я не могу их использовать, я полагаю, они могут использовать другой код флага, означающий, что они являются нулевыми. – user7002207

ответ

1

Вот один из способов сделать это. Обратите внимание, однако, что было бы (вероятно) гораздо лучше использовать эти методы ранее в вашем процессе, если это возможно. Например, если file_date не сохраняется таким образом в вашей базовой таблице, но вместо этого это результат некоторой обработки, было бы лучше использовать базовые данные вместо выражения file_date. Также возможно, что аналитические функции могут быть использованы раньше, поэтому вы делаете меньше проходов через данные (предполагая, конечно, что производительность важна, иногда это не так).

with 
    test_data (group_id, file_date, flag) as (
     select 'a', 'abcsum16', 3 from dual union all 
     select 'a', 'abcwin16', null from dual union all 
     select 'b', null  , 4 from dual union all 
     select 'b', 'abcsum15', 4 from dual union all 
     select 'c', 'abcwin16', 7 from dual union all 
     select 'c', 'abcwin16', 7 from dual union all 
     select 'd', 'abcsum09', 3 from dual union all 
     select 'd', null  , null from dual 
    ) 
-- end of test data (not part of the SQL query); query begins BELOW THIS LINE 
select group_id, file_date, flag, 
     case when count(*) over (partition by group_id) = 2 
       and 
       count(distinct file_date) over (partition by group_id) = 1 then 0 
      when to_number(substr(file_date, -2)) = 16      then 1 
      when to_number(substr(file_date, -2)) between 10 and 15   then 2 
      else                 3 end 
       as date_flag 
from test_data 
where file_date is not null and flag is not null 
; 

GROUP_ID FILE_DATE FLAG DATE_FLAG 
-------- --------- ---- ---------- 
a  abcsum16  3   1 
b  abcsum15  4   2 
c  abcwin16  7   0 
c  abcwin16  7   0 
d  abcsum09  3   3 

5 rows selected. 
Смежные вопросы