Oracle SQL тег каждый первый дубликат с истинным и другие с ложным - PullRequest
0 голосов
/ 18 сентября 2018

Будучи новичком в SQL oracle, я работаю над таблицей CATS с 4 полями varchar2 country, hair, color и firstItemFound.Я пытаюсь редактировать запрос sql, поэтому каждый раз, когда я нажимаю новый кортеж name || country || color, я добавляю атрибут 'true', если я уже нашел этот кортеж, я добавляю атрибут 'false'.

Я думалоб этом:

шаг 1) Обновление (выберите отличное имя, страну, цвет от кошек) tmp_cats set firstItemFound = true;

шаг 2) Обновить котов, заданных firstItemFound = false, где firstItemFound равно нулю;

Но 1) не работает, поскольку вы не можете обновитьнефизический взгляд.Есть ли работа вокруг?Можно ли сделать это за одну операцию вместо двух?

Вот мои значения таблицы (столбец firstItemFound имеет нулевые значения):

NAME   |COUNTRY   |COLOR  |
-------|----------|-------|
France |Shorthair |Red    |
Brazil |Longhair  |Yellow |
France |Shorthair |Red    |
France |Longhair  |Brown  |
France |Longhair  |Black  |
Brazil |Longhair  |Yellow |
Brazil |Longhair  |Black  |
Brazil |Longhair  |Brown  |
Brazil |Longhair  |Yellow |

Вот мой требуемый результат:

country    hair       color    firstItemFound
---------------------------------------------
France   Shorthair     Red      true
France   Shorthair     Red      false
France   Longhair     Brown     true
France   Longhair     Black     true
Brazil   Longhair     Yellow    true
Brazil   Longhair     Yellow    false
Brazil   Longhair     Yellow    false
Brazil   Longhair     Black     true
Brazil   Longhair     Brown     true

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать dens_rank, включая и дополнительный столбец, такой как id для заказа:

with t(id,country,hair,colour) as
(
 select 1,'France', 'Shorthair', 'Red' from dual union all
 select 2,'Brazil', 'Longhair', 'Yellow' from dual union all
 select 3,'France', 'Shorthair', 'Red' from dual
)
 select country,hair,colour, 
        (case when ( dense_rank() over (partition by country,hair,colour order by id) = 1 ) 
             then 'true'
             else 'false'
        end) as firstItemFound          
   from t 
  order by id;

COUNTRY HAIR       COLOUR   FIRSTITEMFOUND
France  Shorthair   Red         true
Brazil  Longhair    Yellow      true
France  Shorthair   Red         false
0 голосов
/ 18 сентября 2018

вы можете использовать row_number для создания 1-го элемента истинным

select *,case when rn=1 then true else false end as firstItemFound  from 
(select country,hair,colur, row_number() 
over(partition by country,hair,colur order by country) rn from t
) t

или вы можете использовать выражение cte

with t as (
select * from 
(
select 'France' as country  ,'Shorthair' as hair,'Red' as colur from dual
union all 
select 'Brazil','Longhair','Yellow' from dual
union all
select 'France' ,'Shorthair','Red' from dual

)  
) , t2 as
(
select country,hair,colur, row_number() 
over(partition by country,hair,colur order by country) rn from t

)select t2.*, case when rn=1 then 'true' else 'false' end as firstItemFound  from t2

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=65146824ed31dbbc6daa40676220cdf8

COUNTRY     HAIR    COLUR   RN  FIRSTITEMFOUND
Brazil  Longhair    Yellow  1   true
France  Shorthair   Red     1   true
France  Shorthair   Red     2   false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...