powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как написать запрос, чтобы удалить повторы?
14 сообщений из 14, страница 1 из 1
Как написать запрос, чтобы удалить повторы?
    #39962421
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим есть таблица с данными,
ID N_POS VALUE_1 VALUE_211 1 112 1 113 1 221 1 122 1 223 1 224 2 225 1 326 1 427 1 428 1 429 1 4210 1 4211 1 5212 1 5213 1 4
хочу выбрать данные у которых ID=2. Но не просто выбрать, а чтобы сохранился порядок по N_POS и удалить повторы в колонках VALUE_1, VALUE_2, заменить повторяющиеся на NULL, т.е. хочу получить таблицу вида
ID N_POS VALUE_1 VALUE_221 1 122 1 223 24 2 225 1 326 1 427 28 29 210 211 1 5212 213 1 4
здесь удаляются значения при N_POS in (3, 7, 8, 9, 10, 12), потому что это повтор предыдущих (в исходной таблице они выделены красным).

при N_POS=13 значения остаются, потому что хотя в 6-й строке эти значения уже были, но в предыдущей строке, при N_POS=12, значения другие, другая пара значений в исходной таблице, пара (1, 4)в 13-й строке не равна паре (1, 5) в 12-й строке

как написать запрос?

может эти строки как-то отметить сперва, потом почистить? голова уже сломалась
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962428
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно это делается не в запросе, а одним флажком генератора отчётов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962430
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234,

Сага о XYZ
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962431
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
генератор отчетов мне не доступен, что я ему подсуну, то он и отображает

я могу вложенные запросы нагородить, аналитические функции всякие, но слишком сложно получается, полей много
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962442
mnbvcx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anton_1234


как написать запрос?

может эти строки как-то отметить сперва, потом почистить? голова уже сломалась

Ты просто сравнивай значения полей value1 и value2 с предыдущими значениями для выбранного id.
И если пары равные, ставь в запросе ещё пару полей с наллом.
Тебе должна помочь оконная функция lag().
Типа
Код: sql
1.
2.
3.
--это псевдокод
case when value1 = lag(value1) and value2 = lag(value2) then null else value1 end value1_2out,
case when value1 = lag(value1) and value2 = lag(value2) then null else value2 end value2_2out
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962443
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я могу вложенный запрос какой-то сделать, сгородить, что-то типа
ID N_POS VALUE_1 VALUE_2 LAG(VALUE_1) LAG(VALUE_2)21 1 1 NULL NULL22 1 21123 1 21224 2 21225 1 32226 1 41327 1 41428 1 41429 1 414210 1 414211 1 514212 1 515213 1 415
а из него уже вытаскивать, сравнивать значения
но что-то как-то коряво получается
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962446
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mnbvcx
Anton_1234


как написать запрос?

может эти строки как-то отметить сперва, потом почистить? голова уже сломалась

Ты просто сравнивай значения полей value1 и value2 с предыдущими значениями для выбранного id.
И если пары равные, ставь в запросе ещё пару полей с наллом.
Тебе должна помочь оконная функция lag().
Типа
Код: sql
1.
2.
case when value1 = lag() and value2 = lag() then null else value1 end value1_2out,
case when value1 = lag() and value2 = lag() then null else value2 end value2_2out

примерно что-такое я и хотел
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962465
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234генератор отчетов мне не доступен

Это как?

Тогда просто напиши докладную с формулировкой "проблема на вашей стороне" тому, кому он
доступен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962667
Nicolese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select id, N_POS, 
case when rn != 1 and id = 2 then null else VALUE_1 end as VALUE_1,
case when rn != 1 and id = 2 then null else VALUE_2 end as VALUE_2
(
select id, N_POS, VALUE_1, VALUE_2, row_number () over (partition by ID order by N_POS asc) as rn
from t
)
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962671
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234

примерно что-такое я и хотел

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
SQL> ed
Wrote file afiedt.buf

  1  with t (ID,N_POS,VALUE_1,VALUE_2) as (
  2  select 1,1,1,1 from dual union all
  3  select 2,1,1,1 from dual union all
  4  select 2,2,1,2 from dual union all
  5  select 2,3,1,2 from dual union all
  6  select 2,4,2,2 from dual union all
  7  select 2,5,1,3 from dual union all
  8  select 2,6,1,4 from dual union all
  9  select 2,7,1,4 from dual union all
 10  select 2,11,1,5 from dual union all
 11  select 2,12,1,5 from dual union all
 12  select 2,13,1,4 from dual
 13  )
 14  select t.*
 15    ,case when
 16               lag(value_1,1,value_1-1) over (order by n_pos) <> value_1
 17       or
 18               lag(value_2,1,value_1-1) over (order by n_pos) <> value_2
 19     then value_1 end v1
 20    ,case when
 21               lag(value_1,1,value_1-1) over (order by n_pos) <> value_1
 22       or
 23               lag(value_2,1,value_1-1) over (order by n_pos) <> value_2
 24     then value_1 end v2
 25* from t where id=2
SQL> /

        ID      N_POS    VALUE_1    VALUE_2         V1         V2
---------- ---------- ---------- ---------- ---------- ----------
         2          1          1          1          1          1
         2          2          1          2          1          1
         2          3          1          2
         2          4          2          2          2          2
         2          5          1          3          1          1
         2          6          1          4          1          1
         2          7          1          4
         2         11          1          5          1          1
         2         12          1          5
         2         13          1          4          1          1

10 rows selected.

SQL>



.....
stax
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962675
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

ой
24 then value_2 end v2

....
stax
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962704
watson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with t (ID,N_POS,VALUE_1,VALUE_2) as (
select 1,1,1,1 from dual union all
select 2,1,1,1 from dual union all
select 2,2,1,2 from dual union all
select 2,3,1,2 from dual union all
select 2,4,2,2 from dual union all
select 2,5,1,3 from dual union all
select 2,6,1,4 from dual union all
select 2,7,1,4 from dual union all
select 2,11,1,5 from dual union all
select 2,12,1,5 from dual union all
select 2,13,1,4 from dual
 )
 select a.id, rownum n_pos2, a.n_pos,
       case when rnum > 1 then null else a.value_1 end val_1,
       case when rnum >1 then null else a.value_2 end val_2, a.rnum
 from (
           select t.*, row_number() over (partition by id, value_1, value_2 order by n_pos) rnum
           from t
         ) a
 where a.id = 2;
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962759
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
watson,
красиво, но не совсем точно, в последнем ряду значение потеряно, паре (1,4) присваивается номер row_number=6, теряется значение
...
Рейтинг: 0 / 0
Как написать запрос, чтобы удалить повторы?
    #39962765
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, я знал, что я на форуме друзей. Прочитал все сообщения какие-то мысли возникли, и даже чего-то наваял, но красиво у меня не выходит. (модельный пример более-менее смотрится, а рабочий пример с кучей таблиц... не очень. Придется еще подумать)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
WITH T (ID,N_POS,VALUE_1,VALUE_2) AS (
SELECT 1,1,1,1 FROM DUAL UNION ALL
SELECT 2,1,1,1 FROM DUAL UNION ALL
SELECT 2,2,1,2 FROM DUAL UNION ALL
SELECT 2,3,1,2 FROM DUAL UNION ALL
SELECT 2,4,2,2 FROM DUAL UNION ALL
SELECT 2,5,1,3 FROM DUAL UNION ALL
SELECT 2,6,1,4 FROM DUAL UNION ALL
SELECT 2,7,1,4 FROM DUAL UNION ALL
SELECT 2,8,1,4 FROM DUAL UNION ALL
SELECT 2,9,1,4 FROM DUAL UNION ALL
SELECT 2,10,1,4 FROM DUAL UNION ALL
SELECT 2,11,1,5 FROM DUAL UNION ALL
SELECT 2,12,1,5 FROM DUAL UNION ALL
SELECT 2,13,1,4 FROM DUAL
 )
SELECT 
    A.ID,
    A.N_POS,
    CASE WHEN A.VAL_1=A.PREV_VAL_1 AND A.VAL_2=A.PREV_VAL_2 THEN NULL ELSE A.VAL_1 END VALUE_1,
    CASE WHEN A.VAL_1=A.PREV_VAL_1 AND A.VAL_2=A.PREV_VAL_2 THEN NULL ELSE A.VAL_2 END VALUE_2
FROM
    (
    SELECT 
        ID, 
        N_POS, 
        VALUE_1 val_1, 
        VALUE_2 val_2, 
        LAG (T.VALUE_1) OVER (ORDER BY T.N_POS) PREV_VAL_1, -- предыдущее значение
        LAG (T.VALUE_2) OVER (ORDER BY T.N_POS) PREV_VAL_2  -- предыдущее значение
    FROM 
        T
    WHERE
        ID=2
    ) A
ORDER BY
    N_POS
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как написать запрос, чтобы удалить повторы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]