Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как затереть повторяющиеся поля?  [new]
A.D.
Member

Откуда:
Сообщений: 267
День добрый!
День добрый!
Каким образом можно из результата select'а удадить только повторяющиеся поля, а не всю строку?
Заранее спасибо.
С уважением.
9 авг 07, 16:23    [4503658]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
что есть повторяющиеся поля и что есть удалить? дайте пример
9 авг 07, 16:31    [4503711]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
A.D.
Member

Откуда:
Сообщений: 267
Предположим, в результате запроса получаем:


Col_A    Col_B   Col_C
---------------------
abc      24       a2r
abc      24       fg6



Нужно получить:


Col_A    Col_B   Col_C
---------------------
                 a2r
                 fg6
9 авг 07, 16:34    [4503738]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Первое из повторяющихся наверное не надо тереть?
select
lag(null, 1, Col_A) over (partition by Col_A, Col_B order by Col_C) as col_A,
lag(null, 1, Col_B) over (partition by Col_A, Col_B order by Col_C) as col_B
from t
9 авг 07, 16:40    [4503781]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
A.D.
Предположим, в результате запроса получаем:


Col_A    Col_B   Col_C
---------------------
abc      24       a2r
abc      24       fg6



Нужно получить:


Col_A    Col_B   Col_C
---------------------
                 a2r
                 fg6


Решение в лоб:
with t as (select 'abc' Col_A, 24 Col_B, 'a2r' Col_C from dual
union all
select 'abc' Col_A, 24 Col_B, 'fg6' Col_C from dual)
 select 
   case
   when t1.col_a = t2.col_a then 
     null 
   else t1.col_a 
   end,
   case
   when t1.col_b = t2.col_b then 
     null 
   else t1.col_b
   end, 
   t1.col_c
   from t t1, t t2
   where t1.col_c = t2.col_c
9 авг 07, 16:41    [4503785]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
M_IV
Member

Откуда:
Сообщений: 1303
как-то так, подправите напильником:
with tab as (select a||b x from t group by a||b having count(a||b) > 1)
select null a, null b, c from t, tab where a||b = t.x 
union all
select a, b, c from t where a||b not in (select x from tab)
9 авг 07, 16:41    [4503789]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Elic
Member

Откуда:
Сообщений: 29977
case when count(distinct col) over () > 1 /*or count(*) <> count(col)*/ then col end as col
+ STFF
9 авг 07, 16:42    [4503798]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Дим On
Member

Откуда: Москва
Сообщений: 55
select case
         when Count(1) over(partition by d.q1) > 1 then
          null
         else
          d.q1
       end,
       case
         when Count(1) over(partition by d.q2) > 1 then
          null
         else
          d.q2
       end
from   (select 1 as q1, 2 as q2
        from   dual
        union all
        select 1 as q1, 3 as q2
        from   dual
        
        ) d
9 авг 07, 16:45    [4503823]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Elic
Member

Откуда:
Сообщений: 29977
Дим On
       case
         when Count(1) over(partition by d.q2) > 1 then
          null
         else
          d.q2
       end
Весьма вольная интерпретация :)
9 авг 07, 16:57    [4503989]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
A.D.
Member

Откуда:
Сообщений: 267
Jannny
Первое из повторяющихся наверное не надо тереть?
select
lag(null, 1, Col_A) over (partition by Col_A, Col_B order by Col_C) as col_A,
lag(null, 1, Col_B) over (partition by Col_A, Col_B order by Col_C) as col_B
from t


Спасибище огроменное!!! То что доктор прописал!!!
Вопросик один (точнее просьба) остался:
В двух словах: lag(...) over (partition by....) - как синтаксис расшифровывается?
В смысле: lag - для того-то, over - для этого.... (в контексте данного запроса, конечно) Просто, времени сейчас доку переводить нет....
Заранее спасибо.
С уважением.
9 авг 07, 19:17    [4504880]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
iV@n
Member

Откуда:
Сообщений: 382
Аналитические функции в oracle
9 авг 07, 19:21    [4504889]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
A.D.
Jannny
Первое из повторяющихся наверное не надо тереть?
select
lag(null, 1, Col_A) over (partition by Col_A, Col_B order by Col_C) as col_A,
lag(null, 1, Col_B) over (partition by Col_A, Col_B order by Col_C) as col_B
from t
Вопросик один (точнее просьба) остался:
В двух словах: lag(...) over (partition by....) - как синтаксис расшифровывается?
Ну это, конечно, немного все-таки трюк (Виталия, если не ошибаюсь ), так что по нему впервые знакомиться с аналитикой немного стремно :)
Давайте, если после статьи возникнут конкретные вопросы, задавайте - ответим :)
10 авг 07, 10:18    [4506369]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Jannny
A.D.
Jannny
Первое из повторяющихся наверное не надо тереть?
select
lag(null, 1, Col_A) over (partition by Col_A, Col_B order by Col_C) as col_A,
lag(null, 1, Col_B) over (partition by Col_A, Col_B order by Col_C) as col_B
from t
Вопросик один (точнее просьба) остался:
В двух словах: lag(...) over (partition by....) - как синтаксис расшифровывается?
Ну это, конечно, немного все-таки трюк (Виталия, если не ошибаюсь ), так что по нему впервые знакомиться с аналитикой немного стремно :)
Давайте, если после статьи возникнут конкретные вопросы, задавайте - ответим :)

По-моему Станислава.:)
10 авг 07, 10:22    [4506396]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
xymbo
По-моему Станислава.:)
Ну да, то ли память девичья, то ли склероз старческий - одно из двух :)
10 авг 07, 10:30    [4506441]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
A.D.
Member

Откуда:
Сообщений: 267
Jannny
Первое из повторяющихся наверное не надо тереть?
select
lag(null, 1, Col_A) over (partition by Col_A, Col_B order by Col_C) as col_A,
lag(null, 1, Col_B) over (partition by Col_A, Col_B order by Col_C) as col_B
from t


Извините, еще немного помучаю....
Данный код сработал на ура (аналитику раньше использовать не приходилось, к сожалению), но есть одна проблемка: а если полей штук 20, то в:
lag(null, 1, Col_A) over (partition by Col_A, Col_B order by Col_C) as col_A,


в over(partition by...) их все и перечислять?

Заранее спасибо.
С уважением.
10 авг 07, 14:22    [4508659]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
A.D.
Jannny
Первое из повторяющихся наверное не надо тереть?
select
lag(null, 1, Col_A) over (partition by Col_A, Col_B order by Col_C) as col_A,
lag(null, 1, Col_B) over (partition by Col_A, Col_B order by Col_C) as col_B
from t


Извините, еще немного помучаю....
Данный код сработал на ура (аналитику раньше использовать не приходилось, к сожалению), но есть одна проблемка: а если полей штук 20, то в:
lag(null, 1, Col_A) over (partition by Col_A, Col_B order by Col_C) as col_A,


в over(partition by...) их все и перечислять?

Заранее спасибо.
С уважением.

Так а сколько полей Вам надо вывести?Всё теже 3 поля?(Col_A, Col_B, Col_C) Тогда не надо перечилсять ничего. Вот простой пример:
WITH t AS
     (  SELECT 'abc' Col_A, 24 Col_B, 32 COL_D ,'a2r' Col_C FROM DUAL
        UNION ALL
        SELECT 'abc', 24, 32, 'fg6'FROM DUAL)
SELECT
  LAG(null, 1, Col_A) OVER (PARTITION BY Col_A ORDER BY Col_C) as col_A,
  LAG(null, 1, Col_B) OVER (PARTITION BY Col_A ORDER BY Col_C) as col_B,
  Col_C
FROM t
10 авг 07, 14:30    [4508740]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Elic
Member

Откуда:
Сообщений: 29977
A.D.
в over(partition by...) их все и перечислять?
Зависит от того, что же ты хочешь получить. Можно все, а можно и "лесенкой".
10 авг 07, 14:30    [4508743]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Elic
Member

Откуда:
Сообщений: 29977
xymbo
Тогда не надо перечилсять ничего
LAG(null, 1, Col_B) OVER (PARTITION BY Col_A ORDER BY Col_C) as col_B,
Лажа :)
10 авг 07, 14:33    [4508775]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Elic
xymbo
Тогда не надо перечилсять ничего
LAG(null, 1, Col_B) OVER (PARTITION BY Col_A ORDER BY Col_C) as col_B,
Лажа :)

Копи-паст проклятый. Забыл подправить.
10 авг 07, 14:34    [4508784]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Elic
Member

Откуда:
Сообщений: 29977
xymbo
Копи-паст проклятый. Забыл подправить.
Всё равно лажа. Подумай хорошенько .
10 авг 07, 14:39    [4508835]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Elic
xymbo
Копи-паст проклятый. Забыл подправить.
Всё равно лажа. Подумай хорошенько .

И без PARTITION можно обойтись. Но я не понял, что ты имел ввиду.
10 авг 07, 14:46    [4508877]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Elic
Member

Откуда:
Сообщений: 29977
xymbo
Но я не понял, что ты имел ввиду.
При b by b и select-order by a,b получится какая-то чехарда :)
10 авг 07, 15:03    [4509050]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Elic
xymbo
Но я не понял, что ты имел ввиду.
При b by b и select-order by a,b получится какая-то чехарда :)

Да, это точно лажа.
Но я потом подразумевал, что надо так b by b select-order by c. То есть как в этом примере
lag(null, 1, Col_B) over (partition by Col_B order by Col_C)
10 авг 07, 15:17    [4509193]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
Elic
Member

Откуда:
Сообщений: 29977
xymbo
Да, это точно лажа.
Но я потом подразумевал, что надо так b by b select-order by c. То есть как в этом примере
lag(null, 1, Col_B) over (partition by Col_B order by Col_C)
С каждым разом показатель степени лажы растёт :)
Ты хоть понимаешь, что при select-order by c
Col_B сгруппировано далеко не как (partition by Col_B order by Col_C) ?
10 авг 07, 15:25    [4509273]     Ответить | Цитировать Сообщить модератору
 Re: Как затереть повторяющиеся поля?  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Elic
xymbo
Да, это точно лажа.
Но я потом подразумевал, что надо так b by b select-order by c. То есть как в этом примере
lag(null, 1, Col_B) over (partition by Col_B order by Col_C)
С каждым разом показатель степени лажы растёт :)
Ты хоть понимаешь, что при select-order by c
Col_B сгруппировано далеко не как (partition by Col_B order by Col_C) ?

Да. Эх, про order by в select я и забыл. А он там скорее всего потом понадобится.
Так можно обеспечить нужный порядок:
SELECT
  LAG(null, 1, Col_B) OVER (PARTITION BY Col_B ORDER BY Col_C)
FROM t
ORDER BY Col_B, Col_C
10 авг 07, 15:42    [4509437]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить